13

認証サーバーからアクセストークンを取得するためにusername-password grantを使用しています。ユーザーがログアウトするか、クライアントアプリケーションを閉じるまで、アクセストークンが期限切れになる前に、提供された最新表示トークンを使用して更新します。だから私は電話を期待リフレッシュしSpring Securityのusername-password grantでリフレッシュトークンを使用して新しいアクセストークンを要求する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つがうまくいかなければならず、重要な設定部分を見る必要がある場合は、それらを追加します。

ありがとうございます!

答えて

24

を私が言ったように、私たちがうろついていることはできませんので、私たちは、クライアントの秘密を使用していませんJavascriptクライアントアプリケーションでとにかく、username-passwordグラントを使用するときは、これは必要ありません。 (アクセストークンを要求する方法を参照してください)。 は確かに私は解決策に近かったし、最終的にそれを考え出し:

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

ので、アクセストークンやクライアントシークレットは必要ありません。

以上、十分に安全だと感じています。

  • クライアントアプリケーション側に秘密を保存しません。
  • ユーザーはログインするために常にパスワードが必要で、自分のリソースしか見ることができません。
  • リフレッシュトークンの妥当性を現実的な時間(就業日など)に制限し、侵害されても攻撃者のウィンドウが制限され、ユーザーが長期にわたってリソースサーバーに便利に接続できるようにしますセッション。
+0

ここでリフレッシュトークンがなぜ必要なのでしょうか。限られた有効性を持つアクセストークンは、より単純なワークフローでまったく同じように動作します。何か不足していますか? – long

+0

あなたのアクセストークンが期限切れで、あなたのユーザーがまだログインしていない場合、あなたはその場合に新しいアクセストークンを取得する必要があります。 –

6

パスワード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/

+0

こんにちは@Kubgfuters、私の設定にはほとんど問題がありません。まず、トークンへのアクセス要求を送信すると、応答はトークンで成功裏に生成されます。しかし、私がリソースにアクセスしようとすると、トークンの代わりにbase64でエンコードされたユーザー名/パスワードを送信すると、sedningトークンの代わりにリソースが正常にアクセスされます。これは私のconfigigurationのURLですhttps://github.com/harmeetsingh0013/dummy_project/blob/master/dummy-project-configuration/src/main/java/com/harmeetsingh13/config/Oauth2SpringSecurityConfig.java –

+0

あなたは一般的にOAuth2ではなく、Springセキュリティの限界について話しています。とにかく説明のために、OAuth2では必須ではありません:https://tools.ietf.org/html/rfc6749#section-4.3.2 –

関連する問題