Google Apps和OAuth最佳做法

时间:2012-03-09 13:30:52

标签: php oauth oauth-2.0 google-apps

我正在努力将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上)有时非常缺乏,如果有人知道任何其他好的信息来源,我也对它们感兴趣。

1 个答案:

答案 0 :(得分:4)

我认为如果你看一下像userinfo端点这样的概念来自最新的OpenID Connect Specs,这可能会有所帮助。 OpenID connect建立在OAuth 2之上。那里有很多,但它仍然值得一看。 This blog article也非常好(和同一博客中的其他人一样)。

不幸的是,我认为Google的实施目前并不是最新的规范草案,所以它可能会成为一段时间的移动目标。这些事情在过去一年中发生了很大的变化。

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

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

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