【问题标题】:Session empty after redirect重定向后会话为空
【发布时间】:2021-02-22 09:33:09
【问题描述】:

我有一个 React JS 应用程序,它向我的后端 API 发出这个请求。即

window.location = "https://my-server.com" + "/gmail/add_account";

无法为 window.location see this 设置 HTTP 标头 此服务器端点重定向到 Google OAuth 页面,该页面返回对我的 redirect_uri 的响应。

def add_account
  # no auth headers sent here, because front-end has used window.location
  gmail_service = GmailService.new
  session[:uid] = params["uid"]
  redirect_to gmail_service.generate_authorization_url()
end

def oauth_postback
  # session object is {} here
  # Since there are no authorization headers, I cannot identify my app's user
  # How can I identify my app's user here?
end

我面临的问题是,当 OAuth 流向我的redirect_uri 发送响应时,它不返回包含任何authorization header,因此我无法确定我的应用程序的哪个用户启动了这个OAuth 流程。
我尝试在/gmail/add_account 端点中设置会话变量,效果很好。在此端点重定向到 OAuth 屏幕并且 Oauth 流向我的 Oauth redirect_uri 发送响应后,我的 session 对象是 {}
如何实现此流程以便我知道哪个用户启动了此 OAuth 流程?

【问题讨论】:

    标签: ruby-on-rails authentication oauth-2.0


    【解决方案1】:

    你基本上有两种选择:

    • state 参数

      state 参数是 OAuth2 规范的一部分(受 Google 支持)。它是您添加到授权 URL 的随机字符串(作为查询参数),并且在用户被重定向回您的站点时将包含在内(作为查询参数)。它用于 CSRF 保护,也可用于识别用户。请确保如果您使用它,它是一次性值(例如,您存储在数据库中的随机值,而不是用户的 ID)。

    • 使用 cookie 的会话

      如果用户之前登录过,您应该能够通过他们的会话 cookie 来识别他们。听起来这是您当前采用的方法,但会话正在重置。

      如果不了解更多关于您的堆栈/代码的信息,很难进行调试,但一个好的第一步是尝试加载您的回调 URL,而不重定向到 Google 以查看会话对象仍然是空的。如果是这样,这表明您通常如何实施会话存在问题,而不是特定于该流程的问题。

      请注意,根据您共享的代码,如果您在没有任何查询参数或路径参数的情况下进行重定向,我不确定如何设置 params["uid"]

    最后,您可以考虑将托管 OAuth 服务用于类似的事情,例如我工作的 Xkit。如果您有一个已登录的用户,您可以使用 Xkit 通过一行代码连接到用户的 Gmail 帐户,并使用一个 API 在您堆栈中的其他任何地方(后端、前端、云功能)检索他们(始终刷新的)访问令牌打电话。

    【讨论】:

    • 我没有使用会话进行身份验证,而是devise_token_auth gem。在这种情况下使用 OAuth state 听起来很合理。感谢您指出。
    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2017-03-31
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多