26

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

ただし、この更新トークン要求を発行する方法の例が見つかりません..

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

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 つが機能し、重要な構成部分を確認する必要がある場合は、それらを追加します。

ありがとう!

4

2 に答える 2

40

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

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

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

全体として、それは十分に安全だと感じています。

  • クライアント アプリ側にシークレットを保存することはありません。
  • ユーザーはログインするために常にパスワードを必要とし、自分のリソースしか見ることができません。
  • リフレッシュ トークンの有効性を就業日などの現実的な時間に制限することで、侵害された場合でも攻撃者の侵入を許す期間を限定し、ユーザーが長時間のセッションを通じてリソース サーバーに接続したままでいられるようにします。
于 2013-10-31T08:45:29.640 に答える
12

パスワード grant_type には、clientId と clientSecret が必要です。あなたは 3 回目の試行に近づいていましたが、Authorization ヘッダーで Access Token の代わりに、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/

于 2013-10-29T14:10:33.387 に答える