web-dev-qa-db-fra.com

Comment obtenir un jeton dans Spring Boot 2 Oauth2?

Je suis nouveau dans la sécurité du printemps oauth2. Je veux exécuter ceci exemple de code du serveur d'autorisation . Je l'exécute avec succès, pour obtenir un jeton, je définis Postman comme suit, puis j'envoie une demande:

Basic Authgrant types

Dans ce cas, j'ai entré l'ID client avec son mot de passe, mais je veux me connecter sans eux. Par exemple, mes utilisateurs envoient leur nom d'utilisateur, leur mot de passe et leur identifiant client, puis obtiennent un jeton. Mais à chaque demande que j'envoie, le serveur renvoie une réponse 401. Dans Spring boot 2 oauth 2, Comment puis-je le faire?

6
Morteza Malvandi

1) Pour obtenir un jeton d'accès , vous devez utiliser une telle demande:

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=*" \

avec Authentification de base et les informations d'identification de votre application (vous pouvez éviter le secret si vous le souhaitez). Le nom de l'utilisateur et son mot de passe que vous devez transmettre dans le corps de la demande ainsi que la valeur "mot de passe" dans le grant_type champ.

En réponse, vous obtenez vos jetons d'accès et d'actualisation, par exemple:

{
    "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) Ensuite, vous pouvez utiliser ce jeton d'accès pour accéder aux ressources de votre application serveur. Dans ce cas, vous avez besoin du type d'authentification du porteur du jeton et de votre jeton d'accès:

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

3) Pour rafraîchir le jeton , vous devez à nouveau utiliser l'authentification de base avec les informations d'identification du client, mais dans ce cas, vous avez besoin de 'refresh_token' comme 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'

Chaque fois que le jeton d'accès expire, vous devez le rafraîchir avec la 3e demande. Vous pourrez alors à nouveau accéder aux ressources.

Informations supplémentaires

1) Ma réponse de comment construire la simple application OAuth2 avec JWT et revendications personnalisées

2) Application de démonstration associée

3) Collection Postman associée

8
Cepr0

La spécification OAuth 2.0 décrit un certain nombre d’octrois ("méthodes") pour qu’une application cliente acquière un jeton d’accès (qui représente la permission d’un utilisateur pour que le client accède à ses données).

Types d'octroi prédéfinis Spring OAuth2:

  • ClientCredentialsTokenGranter
  • RefreshTokenGranter
  • AuthorizationCodeTokenGranter
  • ImplicitTokenGranter
  • ResourceOwnerPasswordTokenGranter (c'est le type d'octroi de mot de passe que vous utilisez dans l'exemple)

Si vous souhaitez modifier la logique d'acquisition de jetons, vous pouvez opter pour TokenGranter personnalisé .

Supplémentaire:

Guide des développeurs OAuth 2

2
Viacheslav