我在任何地方都找不到谷歌OAuth从头到尾应该如何看待身份验证,我应该在数据库中存储什么以及如何存储。
我正在开发允许用户使用Google帐户登录并向他的Gmail帐户授予权限的应用程序,我不太确定所有内容应该如何逐步工作。我有两个想法:
#1
- 用户点击"谷歌登录"按钮
- 应用程序要求
https://www.googleapis.com/auth/userinfo.email
和其他服务(Gmail等(的权限 - 作为回应,我得到了
access_token
,refresh_token
和id_token
- 我将
refresh_token
和id_token
存储在数据库中 - 我生成PHPSESSID并将其存储在数据库中
- 每次用户访问我的网站时,我都会检查PHPSESSID数据库并验证
id_token
- 在这里我有问题...
如果用户尝试从其他浏览器或其他PC登录怎么办?我需要在每次用户登录到我的应用程序时更新refresh_token
和id_token
。这是一个好的解决方案吗?
#2
- 用户点击"谷歌登录"按钮
- 应用程序仅要求允许
https://www.googleapis.com
- 作为回应,我得到了
id_token
- 我将
id_token
存储在数据库中 - 我生成PHPSESSID并将其存储在数据库中
- 每次用户访问我的网站时,我都会检查PHPSESSID数据库并验证
id_token
- 用户登录后,我要求他提供其他Google服务(gmail等(的权限。
- 作为回应,我得到
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 来说几乎是一样的(。