Google Apps和OAuth最佳做法

Bra*_*ram 5 php oauth google-apps oauth-2.0

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

我让人们通过将他们的Google ID存储在数据库中来登录Google,当他们登录时,我请求访问令牌,查询userinfo,查看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).Tokeninfo未在oauth playground中列出,但结果确实显示了令牌保持有效的时间(但是,我也可以自己计算).一个比另一个好吗?

  • 我将整个json对象存储在数据库中(access_token,id_token,expires_in和token_type)但我觉得如果我只存储access_token,我的应用程序仍然可以正常工作(我预见的唯一问题是expires_in时间是否有变化).我需要存储id_token吗?

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

Sha*_*eep 4

我认为如果您查看最新的OpenID Connect 规范(其中 userinfo 端点等概念的来源)可能会有所帮助。OpenID connect 构建在 OAuth 2 之上。其中有很多内容,但仍然值得一看。这篇博客文章也非常好(同一博客中的其他文章也是如此)。

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

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

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

您不应该需要存储id_token. 它有点像授权服务器对用户认证的记录。验证用户身份后,您的应用程序将有兴趣维护访问令牌。