使用 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 登录管理浏览器会话的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google 会话和帐户选择器的移动应用浏览器的行为

使用 Google 会话和帐户选择器的移动应用浏览器的行为

如何通过无头 chrome 管理登录会话?

#yyds干货盘点#会话管理

Spring Security —— 会话管理

Servlet 和 JSP 中的会话管理 [重复]