Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 谷歌应用程序和OAuth最佳实践_Php_Oauth_Oauth 2.0_Google Apps - Fatal编程技术网

Php 谷歌应用程序和OAuth最佳实践

Php 谷歌应用程序和OAuth最佳实践,php,oauth,oauth-2.0,google-apps,Php,Oauth,Oauth 2.0,Google Apps,我正在将Google应用程序集成到我的PHP应用程序中。我已经有了一个登录系统,可以为用户分配一个会话ID(在输入用户名和密码之后),当用户登录时,该ID会存储在数据库中。会话ID在一段时间的不活动后变得无效(可由用户配置,可以是5分钟、15分钟、60分钟……)。该会话ID在url中传递,以检查用户是否仍在登录。注销时,会话ID将从数据库中删除 我让人们通过在数据库中存储他们的Google ID来登录Google,当他们登录时,我请求一个访问令牌,查询userinfo,查看Google ID是否

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

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

这是可行的,我的用户可以使用他们的Google帐户登录,我可以使用存储的access_令牌查询API,但是有些东西会让我觉得笨重,让我对我的工作流程感到不确定:

  • 如果您强制批准您获得一个刷新令牌,我觉得我应该使用这个刷新令牌来获取一个新的访问令牌,而不是在用户再次登录时从数据库中删除旧的访问令牌并输入一个新的访问令牌。另一方面,当登录时,我还不知道它是谁,所以我不知道使用哪个刷新令牌。也许我误解了刷新令牌的用途。而且,我真的不想每次都强制批准,所以在这种情况下我甚至不能使用refresh\u令牌

  • 如前所述,用户可以确定他们的会话将持续多长时间,然而,google access_令牌总是在3600秒后过期。如果用户在系统上工作一个小时,然后谷歌API突然失效,迫使他们再次登录,那就太愚蠢了。GoogleOAuth游乐场显示了一个复选框“在到期前自动刷新令牌”,但我不知道如何做到这一点。我必须在这里使用刷新令牌吗?或者只是在后台请求一个新令牌(如果我没有强制批准)

  • 目前,我正在使用userinfo查询(https://www.googleapis.com/oauth2/v2/userinfo)查找用户id,但我也可以使用tokeninfo(https://www.googleapis.com/oauth2/v1/tokeninfo). Tokeninfo没有在oauth游乐场中列出,但结果确实显示了该令牌保持有效的时间(不过,我也可以自己计算)。一个比另一个好吗

  • 我将整个json对象存储在数据库中(access_token、id_token、expires_in和token_type),但我觉得如果我只存储access_token,我的应用程序仍然可以完美工作(我预见的唯一问题是expires_在时间上是否会发生变化)。例如,我是否需要存储id_令牌


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

我认为,如果您了解一下userinfo端点等概念的最新来源,可能会有所帮助。OpenID connect构建在OAuth 2之上。里面有很多,但可能还是值得一看。也很好(和同一博客中的其他人一样)

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

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

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


您不需要存储
id\u令牌
。这有点像授权服务器对用户身份验证的记录。一旦您验证了用户身份,您的应用程序将对维护访问令牌感兴趣。

非常感谢您的输入,我将阅读您提供的文章,希望他们能在这一过程中帮助我。