谷歌身份验证一步一步


Google authentication step by step

我在任何地方都找不到谷歌OAuth从头到尾应该如何看待身份验证,我应该在数据库中存储什么以及如何存储。

正在开发允许用户使用Google帐户登录并向他的Gmail帐户授予权限的应用程序,我不太确定所有内容应该如何逐步工作。我有两个想法:

#1

  1. 用户点击"谷歌登录"按钮
  2. 应用程序要求https://www.googleapis.com/auth/userinfo.email和其他服务(Gmail等(的权限
  3. 作为回应,我得到了access_tokenrefresh_tokenid_token
  4. 我将refresh_tokenid_token存储在数据库中
  5. 我生成PHPSESSID并将其存储在数据库中
  6. 每次用户访问我的网站时,我都会检查PHPSESSID数据库并验证id_token
  7. 在这里我有问题...

如果用户尝试从其他浏览器或其他PC登录怎么办?我需要在每次用户登录到我的应用程序时更新refresh_tokenid_token。这是一个好的解决方案吗?

#2

  1. 用户点击"谷歌登录"按钮
  2. 应用程序仅要求允许https://www.googleapis.com
  3. 作为回应,我得到了id_token
  4. 我将id_token存储在数据库中
  5. 我生成PHPSESSID并将其存储在数据库中
  6. 每次用户访问我的网站时,我都会检查PHPSESSID数据库并验证id_token
  7. 用户登录后,我要求他提供其他Google服务(gmail等(的权限。
  8. 作为回应,我得到refresh_token并将其存储在数据库中

首先。是否可以为同一域请求两次权限?在此解决方案中,我只需要在每次用户登录应用程序id_token进行更新。

或者也许有更好的方法来进行这种身份验证?

您要

做的是在用户首次登录时将refresh_token与用户的唯一标识符(例如,您可以从id_token中读取的Google用户ID(一起存储。

然后,您可以在服务器端使用此refresh_token,以便在需要代表用户调用 API 时获取access_token

当用户再次访问您的站点并登录(无论他们使用什么浏览器或设备(时,您只需将id_token发送到服务器,提取用户 ID 并检查数据存储是否已存在refresh_token并相应地使用它。

不久前,我在这里写了一篇关于服务器端身份验证的一些可能场景的文章:http://codingwithgerwin.blogspot.co.at/2015/04/google-sign-in-20-server-side.html(它在服务器端使用 Python,但对于 PHP 来说几乎是一样的(。