【问题标题】:Google Apps and OAuth best practicesGoogle Apps 和 OAuth 最佳做法
【发布时间】:2012-03-26 22:49:23
【问题描述】:

我正在努力将 Google Apps 集成到我的 PHP 应用程序中。我已经有一个登录系统,它为用户分配一个会话 ID(在输入用户名和密码后),当用户登录时,它会存储在数据库中。会话 ID 在一段时间不活动后变得无效(可由用户配置, 可以是 5 分钟, 15, 60...)。该会话 ID 在 url 中传递,以检查用户是否仍然登录。注销时,会话 ID 将从数据库中删除。

我让人们通过将他们的 Google ID 存储在数据库中来使用 Google 登录,当他们登录时,我请求访问令牌,查询用户信息,查看 google ID 是否在数据库中,如果是,则分配一个会话此用户的 ID。由于我希望能够查询其他 API,我还将访问令牌 json 存储在数据库中。当用户注销时,访问令牌也会从数据库中删除。

这可行,我的用户可以使用他们的 Google 帐户登录,并且我可以使用存储的 access_token 查询 API,但是有些东西感觉很笨拙,让我对自己的工作流程感到不确定:

  • 如果你 force_approval 你得到一个 refresh_token,我觉得我应该使用这个刷新令牌来获取一个新的访问令牌,而不是从数据库中删除旧的令牌并在用户登录时输入一个新的令牌再次。另一方面,登录时,我还不知道是谁,所以不知道要使用哪个刷新令牌。也许我误解了刷新令牌的用途。另外,我真的不想每次都强制批准,所以在那种情况下我什至不能使用 refresh_token 。

  • 如前所述,用户可以确定他们的会话将持续多长时间,但是,google access_token 总是在 3600 秒后过期。如果用户在系统上工作一个小时,然后谷歌 API 突然失败,迫使他们再次登录,那将是非常愚蠢的。 Google OAuth 游乐场显示了一个复选框“在过期之前自动刷新令牌”,但我没有看到如何执行此操作。我必须在这里使用刷新令牌吗?或者只是在后台请求一个新令牌(如果我没有强制批准)?

  • 目前,我正在使用 userinfo 查询 (https://www.googleapis.com/oauth2/v2/userinfo) 来查找用户 ID,但我也可以使用 tokeninfo (https: //www.googleapis.com/oauth2/v1/tokeninfo)。 oauth playground 中没有列出 Tokeninfo,但结果确实显示了令牌保持有效的时间(不过,我也可以自己计算)。一个比另一个更可取吗?

  • 我将整个 json 对象存储在数据库中(access_token、id_token、expires_in 和 token_type),但我觉得如果我只存储 access_token,我的应用程序仍然可以完美运行(我预见的唯一问题是 expires_in时间变化)。例如,我需要存储 id_token 吗?

我发现 Google 文档(位于 developer.google.com)有时非常缺乏,如果有人知道任何其他好的信息来源,我也会对它们感兴趣。

【问题讨论】:

    标签: php oauth oauth-2.0 google-apps


    【解决方案1】:

    如果您查看最新的OpenID Connect Specs,我认为这可能会有所帮助,其中 userinfo 端点等概念的来源。 OpenID connect 建立在 OAuth 2 之上。其中有很多内容,但可能仍然值得一看。 This blog article 也很好(同博客中的其他人一样)。

    不幸的是,我认为 Google 的实施目前并未与最新的规范草案保持同步,因此它可能会在一段时间内成为一个移动目标。在过去的一年里,这些事情发生了很大变化。

    我同意您的第一点,即每次对用户进行身份验证时都应该获取新的访问令牌,而不是刷新旧的访问令牌。在用户登录并授予您访问令牌之前,您不知道用户是谁。通常,访问令牌的生命周期与用户的会话无关。一旦发布,您的应用程序理论上可以使用它来独立于用户的存在来访问资源。如果要在令牌过期后继续访问资源,则需要在该时间提交刷新令牌以获取新的访问令牌。恐怕我不知道“自动刷新”功能是干什么用的。

    我相信 Google 的 tokeninfo 类似于 OpenID 连接的 check_id 端点,但接受访问令牌或 id 令牌,而不仅仅是后者。请注意,两者的到期时间可能不同。您通常能够从userinfo 端点检索比从check_id 检索更详细的用户数据,后者通常会返回裸露的user_id

    您不需要存储id_token。有点像授权服务器对用户认证的记录。一旦您验证了用户身份,访问令牌就是您的应用程序有兴趣维护的内容。

    【讨论】:

    • 非常感谢您的意见,我会阅读您提供的文章,希望它们对我有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 2018-12-10
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多