2017-04-26 101 views
1

我設置了使用OAuth2密碼授權認證的無會話應用。當用戶使用用戶名和密碼登錄我的應用程序時,我在sessionStorage中保存訪問令牌,有效期爲30分鐘。我還會在sessionStorage中保存刷新令牌,以防我需要延長會話超過30分鐘。刷新令牌有效期爲30天。保存用於會話認證的OAuth2訪問令牌

如果在登錄時選擇了「記住我」複選框,我將保存訪問和刷新標記保存在localStorage中,以便只要刷新標記有效,它們就會保留。

這兩個似乎工作除了幾個問題罰款:

  1. 如果瀏覽器是開放的,並且用戶不會退出會話可能持續30天。
  2. sessionsStorage不會在窗口/選項卡之間持續存在,所以如果用戶打開新窗口,則需要重新登錄。當選擇'記住我'複選框時,這不是問題,因爲localStorage確實在窗口之間存在。

回答

1

我認爲使用刷新標記對JavaScript應用程序不安全 - 您需要訪問/token端點並使用應用程序的祕密進行身份驗證。但祕密在這些應用程序中公開。

我更喜歡OAuth2隱式流,並從/auth端點獲取新標記,prompt=none參數(來自OpenID Connect)。但是,對於隱式流程,您需要獲得更長的生命ID令牌(並在稍後請求帶有ID令牌的訪問令牌),或者在OAuth2上實現「記住我」(更好的選項 - 可以由任何應用)。這也可以通過在標籤之間傳遞令牌來解決問題2。

  1. 「會話」是指使用刷新令牌在30天內生成訪問令牌?如果這是一個問題,你可以實現一些活動檢測器,如果用戶沒有活動,它可以將用戶註銷。 30分鐘。
  2. 可以使用localStorage作爲一種消息傳遞服務,因此您可以將令牌保留在sessionStorage中,但新標籤可以使用localStorage從現有選項卡請求令牌。欲瞭解更多信息請參閱http://www.codediesel.com/javascript/sharing-messages-and-data-across-windows-using-localstorage/
從鏈接的文章

代碼示例:

function eventListener(e) { 
    if (e.key == 'storage-event') { 
     output.innerHTML = e.newValue; 
    } 
} 

function triggerEvent() { 
    localStorage.setItem('storage-event', this.value); 
} 

window.addEventListener("storage", eventListener, true); 
data.addEventListener("keyup", triggerEvent, true); 

的工作流程是這樣的:

  1. 新標籤打開,寫入任意值到localStorage的用一個表示它需要令牌的密鑰。密鑰可以是「newTabOpened」。新選項卡開始監聽另一個鍵「oauth2token」的更改。
  2. 現有標籤監聽「newTabOpened」鍵的變化,並將其標記值寫入「oauth2token」鍵下。
  3. 新選項卡讀取令牌並將其從localStorage中刪除。
+0

我曾考慮過使用localStorage在窗口之間傳遞令牌,但這可能會導致無意中在localStorage中留下訪問/刷新標記。 – Pardoner

+0

新標籤可以在讀取它們後從「localStorage」中刪除標記。 –

+0

沒錯,但問題是你必須將它們放在localStorage中,以期打開新標籤。但如果一個新標籤從未打開,那麼他們就會坐下。 – Pardoner