簡體   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