簡體   English   中英

在Spring Security OAuth2中使用用戶名密碼授予中的刷新令牌請求新的訪問令牌

[英]Request new access token using refresh token in username-password grant in Spring Security OAuth2

我們使用username-password grant從我們的auth服務器獲取訪問令牌。 我們希望使用提供的刷新令牌在訪問令牌到期之前刷新訪問令牌,直到用戶注銷或關閉客戶端應用程序。

但是,我只是找不到如何發出此刷新令牌請求的任何示例。

要獲得令牌,我們稱之為:

curl -v --data "grant_type=password&username=user&password=pass&client_id=my_client" http://localhost:8080/oauth/token

所以要刷新我希望調用看起來像這樣:

curl -v --data "grant_type=refresh_token&access_token=THE_ACCESS_TOKEN&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

或者可能

curl -v -H "Authorization: Bearer THE_ACCESS_TOKEN" --data "grant_type=refresh_token&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

但它只會給我一個401 ..

哦是的,也許我需要添加clientId? 我不能使用客戶端密鑰,因為沒有(請參閱上面獲取令牌的請求)。 畢竟使用用戶名和密碼進行身份驗證。

我認為我們的服務器配置正確,所以我不會在這里發布。 如果我的一個示例請求應該工作,並且您需要查看重要的配置部分,我將添加它們。

謝謝!

正如我所說,我們不使用客戶端秘密,因為我們不能在Javascript客戶端應用程序中閑逛。 當使用用戶名密碼授權時,無論如何都不需要它。 (請參閱我們請求訪問令牌的方式)。 事實上,我接近解決方案並最終弄明白:

curl -v --data "grant_type=refresh_token&client_id=THE_CLIENT_ID&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token

所以不需要訪問令牌或客戶端密鑰。

總而言之,感覺足夠安全。

  • 我們不會在客戶端應用程序端存儲任何秘密。
  • 用戶始終需要密碼才能登錄,並且只能查看其資源。
  • 我們將刷新令牌的有效性限制為像工作日那樣的實際時間,以便即使它被泄露,攻擊者的窗口也受到限制,同時仍允許用戶在整個長會話中方便地保持與資源服務器的連接。

對於密碼grant_type,需要clientId和clientSecret。 第三次嘗試即將結束,但是您在Authorization標頭中傳遞Base64編碼的clientId和clientSecret而不是Access Token。 這是正確的刷新令牌請求:

curl -H "Authorization: Bearer [base64encode(clientId:clientSecret)]" "https://yourdomain.com/oauth/token?grant_type=refresh_token&refresh_token=[yourRefreshToken]"

如需參考,請查看: http//techblog.hybris.com/2012/06/11/oauth2-resource-owner-password-flow/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM