使用 Google 登录管理浏览器会话
Posted
技术标签:
【中文标题】使用 Google 登录管理浏览器会话【英文标题】:Managing browser sessions with Google sign in 【发布时间】:2016-11-14 03:44:11 【问题描述】:我已使用此页面中概述的步骤为我的网站实现了一个 google 登录按钮:
https://developers.google.com/identity/sign-in/web/sign-in
然后该页面提取 id_token 并将其发送到我的后端服务器,该服务器根据 Google 验证端点对其进行验证。然后,我使用他们在 id_token 中编码的 Google ID 来检索与其关联的应用程序特定数据(存储在我的数据库中)。
我只是有点困惑,下一步我需要做什么才能让用户“登录”到我的应用程序并继续安全地从我的后端 API 检索数据。
我打算做以下事情:
-
验证 id_token 后,我为用户创建会话 ID
我将会话 ID 与用户 Google ID 一起存储在数据库的“会话”表中
我通过设置带有会话 ID 的 cookie 来响应请求
对于所有后续请求,我会检查 cookie 中的会话 ID
如果会话表中有该会话 ID 的条目,我会使用与其关联的 Google ID 来检索用户信息
我想知道这听起来是否合理,这是最佳做法还是有更好的方法来做到这一点?是否有安全的方法来生成会话 ID 或者是否有 API 来帮助解决这个问题(我目前正在使用 ASP.Net Web Api 2 作为我的后端服务)
非常感谢,
【问题讨论】:
感谢您就这个完全未解决的话题提出清晰、概括的问题! 【参考方案1】:我认为您混淆了身份验证和授权。您应该在服务器应用程序中拥有自己的用户记录,关键是 Google,而不是“名称”。这是我在 Django (Python) 应用程序中所做的:
def auth_id_token(request):
# This is called by the AJAX code that triggers when
# the user has successfully signed in
id_token = request.POST.get('id_token')
# Using the google-api-python-client library
idinfo = client.verify_id_token(
id_token,
settings.OAUTH2_CLIENT_ID
)
# Use the Django ORM to talk to my user database
user = User.objects.get(email=idinfo['email'])
# Using a Django primitive that makes sure the user
# gets a session cookie and asserts that the user is now signed in
auth.login(request, user)
return http.HttpResponse('User is now signed in on the server')
注意。从此时起,Django 处理所有授权。 Google 只是在那里处理向我证明他/她拥有该电子邮件地址的身份验证。
【讨论】:
用户登录后,我是否需要在 all 后续调用中将令牌发送到我的服务器(Java Spring),以便我可以验证用户是否已登录并且可以访问受保护的资源?谢谢!以上是关于使用 Google 登录管理浏览器会话的主要内容,如果未能解决你的问题,请参考以下文章