Le plug-in OAuth délivre des jetons d'accès OAuth 2.0 basés sur des JSON Web Tokens (JWT), conformes à la norme RFC 9068.
Type de plug-in
Authentification et autorisation.
Configuration du plug-in
Champs
Configuration de l'authentification
|
Champ |
Type de données |
Obligatoire |
Valeur par défaut |
Description |
|
consumers |
array of object |
Oui |
- |
Appelants (consommateurs) autorisés à demander une authentification. |
|
issuer |
string |
Non |
Higress-Gateway |
Émetteur JWT. |
|
auth_path |
string |
Non |
/oauth2/token |
Suffixe de chemin pour la délivrance des jetons. Assurez-vous que la route correspond à ce chemin. Si vous utilisez la gestion des API, créez une API avec le même chemin. |
|
global_credentials |
bool |
Non |
true |
Indique si les identifiants délivrés sur n'importe quelle route accordent l'accès après la réussite de l'authentification du consommateur. |
|
auth_header_name |
string |
Non |
Authorization |
En-tête de requête contenant le JWT. |
|
token_ttl |
number |
Non |
7200 |
Durée de vie du jeton après sa délivrance, en secondes. |
|
clock_skew_seconds |
number |
Non |
60 |
Décalage d'horloge autorisé pour la vérification des champs exp et iat du JWT, en secondes. |
|
keep_token |
bool |
Non |
true |
Indique s'il faut conserver le JWT dans les requêtes transférées vers le backend. |
|
global_auth |
array of string |
Non (obligatoire uniquement pour les configurations au niveau de l'instance) |
- |
Uniquement au niveau de l'instance. Si la valeur est définie sur true, l'authentification s'applique à toutes les routes. Si la valeur est définie sur false, l'authentification s'applique uniquement aux domaines et routes configurés. Si ce paramètre n'est pas défini, l'authentification s'applique globalement uniquement lorsqu'aucune configuration au niveau du domaine ou de la route n'existe. |
Champs dans consumers :
|
Champ |
Type de données |
Obligatoire |
Valeur par défaut |
Description |
|
name |
string |
Oui |
- |
Nom du consommateur. |
|
client_id |
string |
Oui |
- |
ID client OAuth 2.0. |
|
client_secret |
string |
Oui |
- |
Secret client OAuth 2.0. |
Si une route correspond à
auth_path, la requête n'est pas transférée vers le backend. La route génère plutôt un jeton.Si
global_credentialsa la valeur false, assurez-vous que la route avec le plug-in activé n'utilise pas de correspondance exacte. Une route coexistante avec correspondance de préfixe peut provoquer un comportement inattendu.Pour les requêtes authentifiées, un en-tête
X-Mse-Consumerest ajouté pour identifier l'appelant.
(Facultatif) Configuration de l'autorisation
|
Champ |
Type de données |
Obligatoire |
Valeur par défaut |
Description |
|
allow |
array of string |
Non (obligatoire pour les configurations autres qu'au niveau de l'instance) |
- |
Uniquement au niveau de la route ou du domaine. Spécifie quels consommateurs peuvent accéder aux requêtes correspondantes pour un contrôle granulaire des autorisations. |
Les configurations d'autorisation et d'authentification ne peuvent pas coexister dans la même règle.
Exemples
Configuration de l'autorisation au niveau de la route
Appliquez la configuration de plug-in suivante à route-a et route-b :
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Avec cette configuration, les identifiants délivrés par route-a ne peuvent pas accéder à route-b et vice versa.
Pour partager les identifiants entre les routes :
global_credentials: true
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Configuration globale de l'autorisation et configuration de l'authentification au niveau de la route
La configuration suivante active l'authentification JWT pour des routes ou domaines spécifiques. Si un JWT correspond à plusieurs JSON Web Key Sets (JWKSs), le premier consumer correspondant prend effet.
Configuration au niveau de l'instance :
global_auth: false
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- name: consumer2
client_id: 87654321-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: hgfedcba-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Configuration pour route-a et route-b :
allow:
- consumer1
Configuration pour *.example.com et test.com :
allow:
- consumer2
route-aetroute-bsont des routes de passerelle. Les requêtes correspondant à ces routes n'autorisent que le consommateur nomméconsumer1.*.example.comettest.comcorrespondent aux noms de domaine dans les requêtes. Les requêtes correspondant à ces domaines n'autorisent que le consommateur nomméconsumer2.
Activer l'authentification au niveau de la passerelle
Activez l'authentification OAuth2 pour toutes les requêtes de la passerelle :
global_auth: true
consumers:
- name: consumer1
client_id: 12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- name: consumer2
client_id: 87654321-xxxx-xxxx-xxxx-xxxxxxxxxxxx
client_secret: hgfedcba-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Exemples de requêtes
Utiliser le type d'octroi Client Credential
Obtenir un jeton d'accès
# Obtain an access token by using the GET method. We recommend that you use this method.
curl 'http://test.com/oauth2/token?grant_type=client_credentials&client_id=12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx&client_secret=abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
# Obtain an access token by using the POST method. To perform this operation, you need to match a route that points to a real destination service. Otherwise, the gateway does not read request bodies.
curl 'http://test.com/oauth2/token' -H 'content-type: application/x-www-form-urlencoded' -d 'grant_type=client_credentials&client_id=12345678-xxxx-xxxx-xxxx-xxxxxxxxxxxx&client_secret=abcdefgh-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
# Obtain the value of the access_token field from the response.
{
"token_type": "bearer",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6ImFwcGxpY2F0aW9uXC9hdCtqd3QifQ.eyJhdWQiOiJkZWZhdWx0IiwiY2xpZW50X2lkIjoiMTIzNDU2NzgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwiZXhwIjoxNjg3OTUxNDYzLCJpYXQiOjE2ODc5NDQyNjMsImlzcyI6IkhpZ3Jlc3MtR2F0ZXdheSIsImp0aSI6IjEwOTU5ZDFiLThkNjEtNGRlYy1iZWE3LTk0ODEwMzc1YjYzYyIsInN1YiI6ImNvbnN1bWVyMSJ9.NkT_rG3DcV9543vBQgneVqoGfIhVeOuUBwLJJ4Wycb0",
"expires_in": 7200
}
Utiliser le jeton d'accès pour initier une requête
curl 'http://test.com' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6ImFwcGxpY2F0aW9uXC9hdCtqd3QifQ.eyJhdWQiOiJkZWZhdWx0IiwiY2xpZW50X2lkIjoiMTIzNDU2NzgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwiZXhwIjoxNjg3OTUxNDYzLCJpYXQiOjE2ODc5NDQyNjMsImlzcyI6IkhpZ3Jlc3MtR2F0ZXdheSIsImp0aSI6IjEwOTU5ZDFiLThkNjEtNGRlYy1iZWE3LTk0ODEwMzc1YjYzYyIsInN1YiI6ImNvbnN1bWVyMSJ9.NkT_rG3DcV9543vBQgneVqoGfIhVeOuUBwLJJ4Wycb0'
Codes d'erreur
|
Code d'état HTTP |
Message d'erreur |
Raison |
|
401 |
Invalid Jwt token. |
Le JWT est manquant, mal formé ou expiré. |
|
403 |
Access Denied. |
Le consommateur n'est pas autorisé à accéder à cette route. |