[英]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.