我想在我的网站上永久使用oauth2令牌。
使用谷歌API,当用户授权管理他们的谷歌日历时,我从谷歌API获取访问令牌。我想将它保存在数据库中,并将其用于最后一段时间。
但它变得无效。我尝试使用oauth2刷新令牌API刷新令牌。但是得到如下错误。
数组([error] => invalid_grant [error_description] =>令牌已过期或已撤销。)
我不希望用户每次进入网站时都给予许可。
我还希望管理员需要使用此令牌或任何其他方式访问用户的日历。
我怎样才能做到这一点?
答案 0 :(得分:2)
而是尝试获取永久令牌,我正在使用刷新令牌选项。
当我使用标记调用Google日历时,我添加了参数,例如" access_type = offline"如下
$ login_url =' https://accounts.google.com/o/oauth2/auth?scope=' 。 urlencode(' https://www.googleapis.com/auth/calendar')。 '&安培; REDIRECT_URI =' 。 CLIENT_REDIRECT_URL。 '&安培; RESPONSE_TYPE =代码&安培; CLIENT_ID =' 。 CLIENT_ID。 '&安培; ACCESS_TYPE =离线&#39 ;;
用户允许后,我将以refresh_token作为响应获取access_token。我在数据库中保存这些。然后,每当管理员访问用户的日历时,将使用通过refresh_token api调用存储在数据库中的refresh_token获取新的access_token,直到用户在我的站点中使用unsynchronize选项。
用户取消同步日历后,我将更新数据库。 问题解决了。
答案 1 :(得分:0)
底线是您无法获得永久令牌 - 但您可以减少用户重新提供凭据的需要。
解决方案取决于您使用的授权类型(这在很大程度上取决于您的应用程序是在服务器上运行还是在最终用户的计算机上运行)。你提到一个网站,所以希望你使用一个返回刷新代码的授权类型。
如果您的应用在服务器上运行并且您通过authorisation code grant
获得了令牌,那么您应该能够在获得访问令牌时获得刷新令牌。您可以使用该刷新令牌在反向通道上请求新的刷新/访问令牌,而无需您的用户或其凭据。
有效地,您应该可以长期访问用户的Google资源,前提是用户不会撤消访问权限。
如果您使用其他授权类型,例如implicit grant
,则无法获得刷新令牌。您需要定期获取新的访问令牌。如果您的用户仍然在您的应用运行的设备上登录谷歌,那么当您请求新的访问令牌时,他们不应该被要求提供他们的Google凭据,因此您不会经常纠缠他们的凭据。