2017-07-27 65 views
0

我正在嘗試在公共客戶端/本地客戶端(Android應用程序)上實現OAuth 2.0授權代碼授權。沒有client_secret(wso2 5.3.0 IAM)的OAuth2授權碼PKCE

由於不可能存儲設備上的client_secret,我想用這個授權類型與rfc7636/Proof Key for Code Exchange by OAuth Public Clients (PKCE).

我在後端使用WSO2 5.3.0 IAM。

授權步驟工作完全正常,但我沒能獲得訪問令牌沒有client_secretinvalid_request, Missing parameters: client_secret

我誤解了授權碼授與PKCE錯誤還是我錯過的IAM一些配置?

比較:有可能與auth0

最好的問候, 羅伯特

回答

1

即使你使用的授權碼流,client_secret在令牌端點所需,如果您的應用程序的客戶端類型爲保密。 「4.1.3. Access Token Request」在RFC 6749表示如下:描述

如果客戶類型是保密或客戶端發出的客戶端憑證(或交辦的其他認證需求),客戶端必須與授權服務器進行身份驗證在3.2.1節中。

所以,你的應用程序的客戶類型更改爲公共。我不知道WSO2,但我想它提供了設置菜單來切換像下面這樣的客戶端類型。

enter image description here
Authlete的Web控制檯的屏幕截圖)

機密客戶和公衆客戶的定義在 「2.1. Client Types」 在RFC描述6749.

+0

感謝非常好的RFC引號使用code_challenge使用。所以理論上我正走在正確的軌道上。 我還沒有看到在用戶界面中的機密和公用客戶端之間切換的可能性,但必須在某處配置一個配置。 –

1

是的,client_secret是強制性在WSO2 IS實現中,由於Apache OLTU庫已在內部用於實現OAuth2功能。

目前沒有辦法將註冊應用程序作爲公共客戶端解釋。

但是,這並不意味着有任何安全隱患。基本上,建議所說的是,不要將client_secret嵌入到移動應用程序中,因爲這會使其變得易受攻擊。它不會爲受保護的後端資源提供任何額外的安全性,因爲客戶端請求無論如何都未使用client_secret進行身份驗證。如果您將「Base64(client_id:client_secret)」視爲一個單獨的字符串,它在協議或協議的安全性方面沒有任何區別。

因此,在移動應用中使用WSO2 IS時,需要遵循以下建議。

  1. 使用授權碼授權類型,它需要client_secret。
  2. 使用PKCE(在WSO2 IS 5.2.0之後)
  3. 如果您有其他類型的客戶端或通道用於相同的應用程序,例如就像web一樣,然後在IS中將它們註冊爲一個單獨的服務提供者,併爲它們生成一對獨立的client_id,client_secret。
  4. 爲您在WSO2 IS中註冊的特定OAuth2移動客戶端禁用「client_credentials」授予類型,以便這些應用無需用戶身份驗證即可獲得訪問令牌。
  5. 更進一步,如果您需要爲每個移動應用程序實例擁有唯一的客戶端憑據,請使用OAuth2動態客戶端註冊(DCR)來即時生成客戶端憑據。

通過遵循以上5條建議,它可以爲您提供與規範中建議的安全級別相同的安全級別。

0

對於授權授權流程,您可以發送具有空的client_secret的請求。嘗試把這個空字符串像這樣client_secret='',它應該按預期工作。如果沒有client_secret參數,則無法請求TOKEN_URI。

PKCE用於保護authorization code的盜用,授權碼有效期爲10分鐘,授權碼被兌換爲access_token時,我們還會發送code_verifier以確保授權碼不被某個人佔用。 code_verifiercode_challenge產生在一起,同時請求授權碼& code_verifier同時請求access_token