在Raspberry Pi上使用Python刷新Google日历API的身份验证令牌
我们正在使用Google日历API在Raspberry Pi上进行原型设计 此服务的每个用户都将自己的日历连接到Raspberry Pi并使用日历信息 我们使用的覆盆子Pi没有连接键盘或显示器 我们计划将智能手机连接到Raspberry Pi并让它设置日历,但我们正在使用SSH临时完成身份验证过程 我们可以按照以下步骤检索日历信息。 但大约两周后,发生了身份验证错误。 它可能取决于刷新令牌的过期日期。 每两周进行一次身份验证对客户来说非常烦人。 我们能绕开这件事吗 我们发现了关于授权域范围的权限的问题。 这能解决我们的问题吗? 这是否可用于显示独立于域的电子邮件地址的日历? 例如,如果我们委托给admin@example.com我们可以获取与之关联的日历信息吗example@gmail.com? 我们已经为此奋斗了几个月。 请尽可能给我们任何建议 添加:我们的代码如示例所示,但我们将在这里描述它在Raspberry Pi上使用Python刷新Google日历API的身份验证令牌,python,google-cloud-platform,raspberry-pi,google-calendar-api,Python,Google Cloud Platform,Raspberry Pi,Google Calendar Api,我们正在使用Google日历API在Raspberry Pi上进行原型设计 此服务的每个用户都将自己的日历连接到Raspberry Pi并使用日历信息 我们使用的覆盆子Pi没有连接键盘或显示器 我们计划将智能手机连接到Raspberry Pi并让它设置日历,但我们正在使用SSH临时完成身份验证过程 我们可以按照以下步骤检索日历信息。 但大约两周后,发生了身份验证错误。 它可能取决于刷新令牌的过期日期。 每两周进行一次身份验证对客户来说非常烦人。 我们能绕开这件事吗 我们发现了关于授权域范围的权
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'/home/pi/credentials.json', SCOPES)
// --- Try Kelo's advice ------------------------
flow.params['access_type'] = 'offline'
flow.params['include_granted_scopes'] = 'true'
// --- Try Kelo's advice ------------------------
creds = flow.run_console()
# Save the credentials for the next run
with open('/home/pi/token.pickle', 'wb') as token:
pickle.dump(creds, token)
如果使用向导,我们将看到此警告。
谷歌API和直接访问
无论何时访问用户数据,用户都需要对此进行授权,无法回避这一事实。您将始终需要一个能够“登录”或传入令牌的UI。目前,您正在通过SSH进行操作,这很好
你的问题的一部分是关于你是否可以从一个没有交互用户界面的设备上永久访问谷歌API,答案是,不,你不能。假设您的显示器只能提供信息,而不能登录到Google,那么您需要通过SSH或其他方法来完成
服务帐户和非UI方法
您的另一个问题是关于服务帐户是否适用于您的目的。不幸的是,答案也是否定的。服务帐户用于工作区域(同一组织中的人员),我知道这不是您的情况
我知道这是一个物联网设备,而不是一个网络服务器。但是,有一种访问类型称为“脱机”类型。这是由Google提供给Web服务器类型的应用程序的
在创建凭据时找到
说清楚一点,我认为这对你来说不是一个好的解决方案。这是可能的,但对于没有很多技术知识的人来说是不可能的,因为每个用户都必须作为服务器来管理Pi
这就是很多人使用物联网设备所做的。然后,他们可以将Pi作为网页“访问”以进行授权,然后授予其“脱机”类型的访问权限,因此,认证持续时间更长。Pi作为服务器,通常只向一个人提供一个网页,通常在本地网络上。你可以称它为物联网设备或网络服务器,最终它提供相同的功能
管理物联网设备
我不是这一领域的专家,但我知道有针对物联网设备设计的服务,例如:
基本上,为了管理物联网设备,您可以设置如下内容:
关键部分是中间的位,它将管理用户的登录信息和访问令牌。这实质上是具有“脱机”访问权限的“服务器”部分。然后,这将查询日历API以获取信息,并将其发送到该用户的相应物联网设备
当然,这意味着保留一个包含用户信息、访问令牌以及应该更新哪个Raspberry Pi的数据库 还有一些PubSub服务充当在设备之间发送消息的方式: 请注意:这并不意味着您必须管理日历信息,您需要做的只是管理日历API和Raspberry PI之间的登录、令牌和通信。 为什么你可以在安卓上做呢? 这些类型的应用程序在android上工作,因为您是在web UI环境中登录的。由于您已经授权您的设备,您可以通过设备授权应用程序。由于您没有使用Raspberry Pi登录,并且您处于CLI环境中,因此需要刷新令牌 免责声明也许有一种方法可以很容易地做你想做的事,但我不知道。如果你找到一个,请加上你自己的答案,我会很高兴阅读它,因为我也有覆盆子馅饼,这将是非常有趣的我 你能分享每个Raspberry Pis的代码吗?你已经为这个主题创建了两个关于Stackoverflow的问题。您无法实现长期脱机访问用户数据的目标。谷歌要求用户定期重新认证。如果您正在访问用户的数据(也称为敏感作用域和受限作用域),您的应用程序可能需要第三方安全评估,该评估的成本在1.5万美元到7.5万美元(估计)之间@不,对不起。我们忽略了这一评论。我们在变更前的问题声明中已经注意到了这一点。我们的代码是这样的。谢谢你的友好和详细的解释。但我们也不完全理解你的解释。我们将花更多的时间阅读你的解释。我们已经阅读了你的文章很多次,并试图理解它。但你说的是一个不同于我们的系统。我们说的是Raspberry Pi,你把它误认为是服务器应用程序。让我们考虑一个Android设备的例子。在本例中,我们将为Android开发一个应用程序。我们开发的Android应用程序将运行在我们每个客户的智能手机上。我们的应用程序将使用谷歌日历API检索每个客户的日历信息,并将其显示在他们的智能手机上。您可以将此智能手机替换为