web-dev-qa-db-ja.com

Spring Security OAuth2のユーザー名とパスワードの付与で更新トークンを使用して新しいアクセストークンを要求する

ユーザー名とパスワードの付与を使用して、認証サーバーからアクセストークンを取得しています。ユーザーがログアウトするかクライアントアプリを閉じるまで、提供された更新トークンを使用して、有効期限が切れる前にアクセストークンを更新します。

ただし、このリフレッシュトークンリクエストの発行方法の例は見つかりません。

トークンを取得するには、次のように呼び出します。

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を追加する必要がありますか?クライアントシークレットがないため、クライアントシークレットを使用できません(上記のトークン取得リクエストを参照)。結局、ユーザー名とパスワードを使用して認証が行われます。

サーバー構成は正しいと思うので、ここには投稿しません。例のリクエストの1つが機能し、重要な構成部分を確認する必要がある場合は、それらを追加します。

ありがとう!

21
Pete

そのため、私が言ったように、クライアントシークレットを使用しません。これは、Javascriptクライアントアプリでぶらぶらすることができないからです。とにかく、ユーザー名とパスワードの付与を使用する場合は必要ありません。 (アクセストークンのリクエスト方法を参照してください)。実際、私は解決策に近づき、最終的にそれを理解しました:

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

そのため、アクセストークンやクライアントシークレットは不要です。

全体的に十分に安全だと感じています。

  • クライアントアプリ側にシークレットを保存しません。
  • ユーザーはログインするために常にパスワードを必要とし、自分のリソースのみを見ることができます。
  • リフレッシュトークンの有効性を就業日などの現実的な時間に制限するため、たとえそれが危険にさらされたとしても、攻撃者のウィンドウは制限されますが、それでもユーザーは長時間のセッションを通じてリソースサーバーへの接続を維持できます。
35
Pete

パスワードgrant_typeには、clientIdとclientSecretが必要です。 3回目の試行で終了しましたが、Authorizationヘッダーでアクセストークンの代わりにBase64エンコードされたclientIdとclientSecretを渡します。これは適切な更新トークンリクエストです。

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/

9
MattSenter