繁体   English   中英

重定向后会话为空

[英]Session empty after redirect

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

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

无法为window.location设置 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 流程?

您基本上有两种选择:

  • state参数

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

  • 使用 cookie 的会话

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

    在不了解您的堆栈/代码的情况下很难调试它,但是一个好的第一步是尝试加载您的回调 URL,而无需重定向到 Google 以查看会话对象仍然为空。 如果是这样,则表明您通常如何实施会话存在问题,而不是特定于此流程的问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM