Google Apps和OAuth最佳做法

问题描述 投票:5回答:1

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

php oauth oauth-2.0 google-apps
1个回答
4
投票

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

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

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

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

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

热门问题
推荐问题
最新问题