我正在使用PHP示例应用程序构建一个玻璃应用程序作为参考。
据我了解,这款玻璃应用是一款面向用户的网络应用。当用户访问Web应用程序时,他们将授权Web应用程序(使用oauth2)访问其资源,一旦授权成功,Web应用程序将获得访问令牌,然后将其保存在sqlite数据库中(这是store_credentials()存储访问令牌的函数)。
因此,如果我有100个访问该Web应用程序并注册的用户,则该数据库将为这些用户保留100个访问令牌。假设我有一些后端代码每小时从RSS提要中提取,每当我发现有新故事时,我会将其推送给所有注册用户。假设我有一个执行此操作的cron作业,当触发此作业时,我将在数据库中找到所有访问令牌并使用它们进行镜像API调用以插入卡片。但是,当我尝试进行镜像API调用时,如果某些访问令牌已过期,该怎么办?看来我需要让用户重新授权,但此时我并没有与用户交互。如果我有刷新令牌,我可以再次调用oauth来获取新的访问令牌。
感谢。
答案 0 :(得分:2)
您几乎已经回答了自己的问题 - 当您使用OAuth请求权限时,您还应该请求“离线”访问权限。第一次为每个用户执行此操作时,它将为您提供刷新令牌以及您的访问令牌,您应该存储两者。如果您最初没有请求脱机访问,则需要撤消已授予的令牌并使用脱机访问权限重新授予它们。
如果您所指的示例应用程序是https://github.com/googleglass/mirror-quickstart-php处的应用程序,那么所有这些应该已经包含了库。从oauth2callback.php中的$client->getAccessToken()
返回的凭据应包括访问权限和刷新令牌,并通过调用store_credentials()
将这些凭据保存在同一文件中。客户端库应检查访问令牌是否已过期,如果是,则在拨打电话之前获取带有刷新令牌的新令牌。
您可能希望在这些不同的点上查看凭证对象的内容,并确保有刷新令牌。如果没有,请尝试撤销所有令牌并重新开始,因为这听起来像是您第一次授权客户端而没有请求离线访问。
如果您自己这样做,最佳做法是在使用前刷新访问令牌(如果它已过期或即将到期)(因为可能有一些延迟),或者(甚至更好)尝试使用访问令牌,如果失败并出现身份验证错误,请通过刷新令牌获取新的访问令牌,然后重试。