1

我已經閱讀了好幾個月,似乎整個事情可能會在我下面總結的內容上有所收斂。我想在最理想的到來:使用授權碼授權而不使用cookie?

  • 的OAuth2
  • ID連接
  • SPA /移動客戶端
  • JWT有銀行級別的安全質量爲上述

解決方案組件而言。所以這似乎是有道理的。

  • 使用Authorization Code Grant而不使用服務器端會話和cookie,因爲此OAuth流比隱式流更安全。
  • 不要創建服務器端會話或cookie(除了可能記住我的cookie來識別客戶端之前是否已經過身份驗證)。這對縮放和整體簡單性更好。
  • 將JWT/OpenID連接令牌返回給客戶端,以便客戶端可以使用它來發出API請求並在客戶端內作出授權決定。 (我認爲這是OAuth2混合授權代碼授權/隱式流程是什麼?)。將JWT/OpenID連接令牌存儲在客戶端會話存儲中。
  • 擁有短暫的JWT令牌,並在用戶註銷之前提供刷新令牌。客戶端會自動接收刷新令牌,除非它超時/客戶端會話過期或用戶註銷。刷新令牌將由SPA /移動應用正在與之交談的/ OAuth客戶端的邊緣服務器獲取並提供服務。
  • 在註銷(或超時)時,從瀏覽器會話存儲中刪除令牌。

難道這是瘋狂的/聽起來合理嗎?它跳過了無效的令牌,但如果令牌的壽命非常短並且客戶端可以獲得刷新令牌,則似乎可以這樣做。我想用Spring-Boot/Spring Security和Angular 4/5來實現這個功能,我想知道我是否錯過了任何明顯的東西,或者有一種更簡單的方法不會犧牲/降低安全性?

你是否也認爲這會通過「銀行」級別的安全標準檢查?

+0

首先閱讀:https://stackoverflow.com/help/how-to-ask 但我猜使用: ID連接與認證的程序庫:https://openid.net/certification/ 遵循OpenID Connect的最佳實踐 https://openid.net/specs/openid-connect-basic-1_0.html https://openid.net/specs/openid-connect-implicit-1_0.html – jwilleke

+0

是啊我知道你的意思是「如何問」提示 - 我覺得我正在用上述方法「跳出框」,所以只是檢查是否有人看到任何瘋狂的事情,或許我應該考慮。 .. – Ole

回答

1

幾件事情要清除掉,

1.你必須使用implicit flow的基於瀏覽器的應用程序

這是監守這樣的應用程序無法進行保密,不能保護它臨危刷新令牌。 OAuth2.0 RFC也解釋了流量。

另外,根據OAuth2.0 Refresh token definition,刷新令牌是一種憑證。

刷新令牌來獲得訪問令牌

部分10.4 of RFC6749介紹了更多關於刷新令牌的安全性,從而解釋了需要使用基於broweser應用隱流憑據。

2.隱流不發送令牌

刷新從RFC的OAuth2.0

當使用隱式交付式流動,刷新令牌不是 返回,這需要重複授權過程一次 訪問令牌到期。當訪問令牌到期

所以,你必須去通過相同的流走新型標記設置

3 ID令牌使用

必須根據specficiation vlaidate。如果ID令牌是有效的,用戶進行身份驗證

4. API調用

兩個選擇,要麼使用訪問令牌或用戶ID令牌。

訪問令牌與API端點通信的用法很常見。這是訪問令牌的預期用法。從API端點,訪問令牌可以使用introspection endpoint(如果身份提供商支持一個)進行vlaidated。

但是,ID令牌JWT也可以用作不記名令牌。爲此,API端點將需要包裝器來驗證ID令牌。 This博客/文檔包含一些要考慮的優點。

+1

關於。 1:從技術上講,您也可以使用授權代碼授權,但僅限於公共客戶端,所以沒有client_secret –

+0

謝謝 - 很好的答案 - 它說明了我問這個問題的原因之一。我想使用授權碼授權流程,但使用刷新令牌,沒有會話(沒有其他會話令牌/ cookie),同時還將jwt令牌或刷新令牌返回給客戶端/ SPA進行資源服務器驗證。這種情況不屬於OAuth2的標準/藍圖,但我認爲可以通過稍微調整授權服務器來實現。 – Ole

+0

也許一個更好的聚焦問題是「如何在沒有服務器會話的情況下使用基於瀏覽器的授權代碼授權流程」 – Ole