【问题标题】:how to use oauth2 token permanently?如何永久使用 oauth2 令牌?
【发布时间】:2017-12-12 17:50:17
【问题描述】:

我想在我的网站中永久使用 oauth2 令牌。

使用谷歌 API,当用户授予管理其谷歌日历的权限时,我从谷歌 API 获取访问令牌。我想将它保存在数据库中并长期使用。

但它变得无效。我尝试使用 oauth2 刷新令牌 API 刷新令牌。但是得到如下错误。

Array ([error] => invalid_grant [error_description] => 令牌已过期或被撤销。)

我不希望用户每次进入网站时都给予权限。

我还希望管理员需要使用此令牌或任何其他方式访问用户的日历。

我怎样才能做到这一点?

【问题讨论】:

    标签: oauth-2.0 google-api google-calendar-api google-oauth


    【解决方案1】:

    我使用的是刷新令牌选项,而不是尝试获取永久令牌。

    当我使用标签调用谷歌日历时,我添加了类似“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=code&client_id=' 。客户 ID 。 '&access_type=offline';

    用户允许后,我将获取 access_token 和 refresh_token 作为响应。我将它们保存在数据库中。然后每次当用户的日历被管理员访问时,都会通过 refresh_token api 调用使用存储在数据库中的 refresh_token 获取新的 access_token,直到用户使用我网站中的 unsynchronize 选项。

    一旦用户取消同步日历,我将更新数据库。 问题已解决。

    【讨论】:

    • 你是否在 swift 中实现了谷歌日历我需要帮助
    • @DilipTiwari 抱歉。我没有快速完成。顺便说一句,我可以知道你面临的问题是什么?
    • 我在 swift 中成功实现了谷歌日历,但我想通过我的应用创建活动
    【解决方案2】:

    底线是您无法获得永久令牌 - 但您可以减少用户重新提供凭据的需要。

    解决方案取决于您使用的授权类型(很大程度上取决于您的应用程序是在服务器上还是在最终用户的机器上运行)。您提到了一个网站,因此希望您使用也返回刷新代码的授权类型。

    如果您的应用在服务器上运行并且您通过authorisation code grant 获得令牌,那么您在获得访问令牌时也应该能够获得刷新令牌。您可以使用该刷新令牌在反向通道上请求新的刷新/访问令牌,而无需您的用户或其凭据。

    如果用户不撤销访问权限,那么您应该可以长期访问用户的谷歌资源。

    如果您使用其他授权类型,例如implicit grant,则无法获得刷新令牌。您需要定期获取新的访问令牌。如果您的用户在运行您的应用的设备上仍然登录到 google,那么当您请求新的访问令牌时,他们不应该被要求提供他们的 google 凭据,这样您就不会一直纠缠他们获取凭据。

    【讨论】:

    • 感谢您的回答。我得到了我需要的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2022-10-30
    • 2019-05-11
    • 2013-01-11
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多