2012-03-09 66 views
5

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

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

这工作,我的用户可以登录使用他们的谷歌帐户,我可以在API的使用存储的access_token查询,但有些事情让人感到笨拙让我觉得不确定我的工作流程:

  • 如果你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游乐场中,但结果确实显示了令牌的有效期(但我也可以自己计算)。一个比另一个更好吗?我存储整个json对象在数据库(access_token,id_token,expires_in和token_type),但我觉得我的应用程序仍然会工作完美,如果我只存储access_token(只有问题,我预见如果expires_in时间变化)。例如,我需要存储id_token吗?

我发现谷歌文​​档(在developers.google.com)有时也很缺乏的,如果任何人知道的任何其他信息的良好来源,我感兴趣的是他们。

回答

4

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

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

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

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

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

+0

非常感谢您的意见,我会阅读您提供的文章,并希望他们能够一路帮助我。 – Bram 2012-03-12 12:06:40