在 Raspberry Pi 上使用 Python 刷新 Google 日历 API 的身份验证令牌
Refreshing Authentication token for Google Calendar API with Python on Raspberry Pi
我们正在使用 Google 日历 API 在 Raspberry Pi 上制作原型。
此服务的每个用户都会将他或她自己的日历连接到 Raspberry Pi 并使用日历信息。
我们使用的 Raspberry Pi 没有连接键盘或显示器。
我们正计划将智能手机连接到 Raspberry Pi 并设置日历,但我们正在使用 SSH 暂时完成身份验证过程。
我们能够按照以下步骤检索日历信息。
https://developers.google.com/calendar/quickstart/python
但是大约两周后,出现了身份验证错误。
这可能取决于刷新令牌的到期日期。
每两周进行一次身份验证对客户来说非常烦人。
我们可以解决这个问题吗?
我们发现了委派全域权限。
https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority
这是否解决了我们的问题?
这可以用于显示与域无关的电子邮件地址的日历吗?
比如我们委托给 admin@example.com 是否可以获取到 example@gmail.com?
关联的 Calendar 信息
我们已经为此苦苦挣扎了几个月。
请给我们任何建议。
添加:我们的代码如示例中所示,但我们将在此处描述。
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)
如果我们使用向导,我们会看到这个警告。
Google API 和直接访问
每当您访问 用户数据 时,都需要用户授权,没有办法绕过这个事实。您将始终需要一个能够“登录”或传递令牌的 UI。目前您正在通过 SSH 进行操作,这很好。
你的问题的一部分是关于你是否可以从没有交互式 UI 的设备上永久访问 Google API,以及答案不幸的是,不,你不能。假设你的显示器只能显示信息,不能登录Google,那你就需要通过SSH或者其他方式登录了。
服务帐户和非 UI 方法
您的另一个问题是关于服务帐户是否适合您的目的。不幸的是,答案也是否定的。服务帐户适用于 Workspace 域(同一组织中的人员),据我所知,您的情况并非如此。
Offline Access
我知道这是一个物联网设备,不是网络服务器。但是,有一种访问类型称为“离线”类型。这由 Google 提供给 Web 服务器 type 应用程序。
创建凭据时找到的。
明确地说,我不认为这对您来说是一个很好的解决方案。这是可能的,但不适合没有很多技术知识的人,因为每个用户都必须管理 Pi-as-server。
这就是很多人使用他们的物联网设备所做的事情。然后他们可以将 Pi 作为网页“访问”以授予授权,然后授予“离线”类型的访问权限,因此身份验证持续时间更长。作为服务器的 Pi,通常只为一个人提供一个网页,通常在本地网络上。你可以称它为物联网设备或网络服务器,最终它起着同样的作用。
管理物联网设备
我不是这个领域的专家,但我知道有专为物联网设备设计的服务,例如:
主要是为了管理物联网设备,您可以设置如下内容:
关键部分是中间的位,它将管理用户的登录信息和访问令牌。这本质上是具有“离线”访问权限的“服务器”部分。然后这将查询日历 API 以获取信息并将其发送到该用户的适当物联网设备。
这当然意味着保留一个包含用户信息、访问令牌的数据库,Raspberry Pi 应该更新。
还有一些 PubSub 服务可以作为在设备之间发送消息的方式:
请注意:这并不意味着您必须管理日历信息,您需要做的只是管理登录、令牌和通讯 在日历 API 和 Raspberry Pi 之间。
为什么可以在 Android 上完成?
这些类型的应用程序可以在 android 上运行,因为您 已登录 Web-UI 环境。由于您已经授权您的设备,您可以通过您的设备授权应用程序。由于您未使用 Raspberry Pi、 和 登录,您处于 CLI 环境中,您需要刷新令牌。
免责声明
可能有一种方法可以轻松地做你想做的事,但我不知道。如果你找到了,请添加你自己的答案,我很乐意阅读它,因为我也有 Raspberry Pis,这对我来说会很有趣!
我们正在使用 Google 日历 API 在 Raspberry Pi 上制作原型。
此服务的每个用户都会将他或她自己的日历连接到 Raspberry Pi 并使用日历信息。
我们使用的 Raspberry Pi 没有连接键盘或显示器。
我们正计划将智能手机连接到 Raspberry Pi 并设置日历,但我们正在使用 SSH 暂时完成身份验证过程。
我们能够按照以下步骤检索日历信息。 https://developers.google.com/calendar/quickstart/python
但是大约两周后,出现了身份验证错误。 这可能取决于刷新令牌的到期日期。 每两周进行一次身份验证对客户来说非常烦人。 我们可以解决这个问题吗?
我们发现了委派全域权限。 https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority
这是否解决了我们的问题? 这可以用于显示与域无关的电子邮件地址的日历吗? 比如我们委托给 admin@example.com 是否可以获取到 example@gmail.com?
关联的 Calendar 信息我们已经为此苦苦挣扎了几个月。 请给我们任何建议。
添加:我们的代码如示例中所示,但我们将在此处描述。
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)
如果我们使用向导,我们会看到这个警告。
Google API 和直接访问
每当您访问 用户数据 时,都需要用户授权,没有办法绕过这个事实。您将始终需要一个能够“登录”或传递令牌的 UI。目前您正在通过 SSH 进行操作,这很好。
你的问题的一部分是关于你是否可以从没有交互式 UI 的设备上永久访问 Google API,以及答案不幸的是,不,你不能。假设你的显示器只能显示信息,不能登录Google,那你就需要通过SSH或者其他方式登录了。
服务帐户和非 UI 方法
您的另一个问题是关于服务帐户是否适合您的目的。不幸的是,答案也是否定的。服务帐户适用于 Workspace 域(同一组织中的人员),据我所知,您的情况并非如此。
Offline Access
我知道这是一个物联网设备,不是网络服务器。但是,有一种访问类型称为“离线”类型。这由 Google 提供给 Web 服务器 type 应用程序。
创建凭据时找到的。
明确地说,我不认为这对您来说是一个很好的解决方案。这是可能的,但不适合没有很多技术知识的人,因为每个用户都必须管理 Pi-as-server。
这就是很多人使用他们的物联网设备所做的事情。然后他们可以将 Pi 作为网页“访问”以授予授权,然后授予“离线”类型的访问权限,因此身份验证持续时间更长。作为服务器的 Pi,通常只为一个人提供一个网页,通常在本地网络上。你可以称它为物联网设备或网络服务器,最终它起着同样的作用。
管理物联网设备
我不是这个领域的专家,但我知道有专为物联网设备设计的服务,例如:
主要是为了管理物联网设备,您可以设置如下内容:
关键部分是中间的位,它将管理用户的登录信息和访问令牌。这本质上是具有“离线”访问权限的“服务器”部分。然后这将查询日历 API 以获取信息并将其发送到该用户的适当物联网设备。
这当然意味着保留一个包含用户信息、访问令牌的数据库,Raspberry Pi 应该更新。
还有一些 PubSub 服务可以作为在设备之间发送消息的方式:
请注意:这并不意味着您必须管理日历信息,您需要做的只是管理登录、令牌和通讯 在日历 API 和 Raspberry Pi 之间。
为什么可以在 Android 上完成?
这些类型的应用程序可以在 android 上运行,因为您 已登录 Web-UI 环境。由于您已经授权您的设备,您可以通过您的设备授权应用程序。由于您未使用 Raspberry Pi、 和 登录,您处于 CLI 环境中,您需要刷新令牌。
免责声明
可能有一种方法可以轻松地做你想做的事,但我不知道。如果你找到了,请添加你自己的答案,我很乐意阅读它,因为我也有 Raspberry Pis,这对我来说会很有趣!