【发布时间】: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