web-dev-qa-db-ja.com

Spring Boot 2 OAuth2でトークンを取得するにはどうすればよいですか?

私は春のセキュリティoauth2の新人です。これを実行したい 認証サーバーのサンプルコード 。私はそれを正常に実行し、トークンを取得するために、postmanを次のように設定してリクエストを送信します。

Basic Authgrant types

この場合、クライアントIDとパスワードを入力しましたが、クライアントIDなしでログインしたいと思います。たとえば、ユーザーがユーザー名、パスワード、クライアントIDを送信してから、トークンを取得します。しかし、私が送信するすべての要求は、サーバーが401応答を返します。 Spring boot 2 oauth 2、どうすればできますか?

6

1)アクセストークンを取得するにはそのようなリクエストを使用する必要があります:

curl --user client:secret \
  -X POST http://localhost:8080/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=password&username=username&password=password&scope=*" \

Basic Authとアプリケーションの資格情報を使用します(必要に応じて秘密を回避できます)。リクエストの本文で渡す必要があるユーザーの名前とパスワード、およびgrant_typeフィールドの「パスワード」値。

応答として、アクセストークンと更新トークンを取得します。次に例を示します。

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImV4cCI6MTU0Nzc2NDIzOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiYzk1YzkzYTAtMThmOC00OGZjLWEzZGUtNWVmY2Y1YWIxMGE5IiwiY2xpZW50X2lkIjoiY2xpZW50In0.RWSGMC0w8tNafT28i2GLTnPnIiXfAlCdydEsNNZK-Lw",
    "token_type": "bearer",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImF0aSI6ImM5NWM5M2EwLTE4ZjgtNDhmYy1hM2RlLTVlZmNmNWFiMTBhOSIsImV4cCI6MTU0Nzc2NzcxOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiZDRhNGU2ZjUtNDY2Mi00NGZkLWI0ZDgtZWE5OWRkMDJkYWI2IiwiY2xpZW50X2lkIjoiY2xpZW50In0.m7XvxwuPiTnPaQXAptLfi3CxN3imfQCVKyjmMCIPAVM",
    "expires_in": 119,
    "scope": "*"
    "jti": "c95c93a0-18f8-48fc-a3de-5efcf5ab10a9"
}

2)次に、そのアクセストークンを使用してサーバーアプリケーションのリソースへのアクセスを取得できます。この場合、Bearer Token認証タイプとアクセストークンが必要です。

curl -X GET http://localhost:8080/demo \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImV4cCI6MTU0Nzc2NDIzOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiYzk1YzkzYTAtMThmOC00OGZjLWEzZGUtNWVmY2Y1YWIxMGE5IiwiY2xpZW50X2lkIjoiY2xpZW50In0.RWSGMC0w8tNafT28i2GLTnPnIiXfAlCdydEsNNZK-Lw'

3)リフレッシュトークンを実行するには、クライアント認証情報を使用した基本認証を再度使用する必要がありますが、この場合、「refresh_token」がgrant_type

curl --user client:secret \
  -X POST http://localhost:8080/oauth/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=refresh_token&scope=*&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2VtYWlsIjoidXNlckBtYWlsLmNvbSIsInVzZXJfbmFtZSI6InVzZXIiLCJzY29wZSI6WyIqIl0sImF0aSI6ImM5NWM5M2EwLTE4ZjgtNDhmYy1hM2RlLTVlZmNmNWFiMTBhOSIsImV4cCI6MTU0Nzc2NzcxOCwiYXV0aG9yaXRpZXMiOlsiQURNSU4iXSwianRpIjoiZDRhNGU2ZjUtNDY2Mi00NGZkLWI0ZDgtZWE5OWRkMDJkYWI2IiwiY2xpZW50X2lkIjoiY2xpZW50In0.m7XvxwuPiTnPaQXAptLfi3CxN3imfQCVKyjmMCIPAVM'

アクセストークンが期限切れになるたびに、3番目のリクエストで更新する必要があります。その後、リソースに再びアクセスできるようになります。

追加情報

1) JWTとカスタムクレームを使用してシンプルなOAuth2アプリを構築する方法についての私の答え

2) 関連デモアプリケーション

3) 関連する郵便配達コレクション

8
Cepr0

OAuth 2.0仕様は、クライアントアプリケーションがアクセストークン(クライアントがデータにアクセスするためのユーザーの権限を表す)を取得するための多くの許可(「方法」)を記述しています。

Spring OAuth2の事前定義された付与タイプ:

  • ClientCredentialsTokenGranter
  • RefreshTokenGranter
  • AuthorizationCodeTokenGranter
  • ImplicitTokenGranter
  • ResourceOwnerPasswordTokenGranter(例で使用するパスワード付与タイプ)

トークン取得ロジックを変更する場合は、カスタムTokenGranterを使用できます。

追加:

OAuth 2開発者ガイド

2
Viacheslav