Cette rubrique explique comment utiliser le flux de code d'autorisation OAuth 2.0 avec Proof Key for Code Exchange (PKCE) pour permettre à une application native (telle qu'une application de bureau ou mobile) d'accéder en toute sécurité aux API Alibaba Cloud pour le compte d'un utilisateur.
Prérequis
Vous avez créé une application native OAuth 2.0 dans la console Resource Access Management (RAM) et spécifié un URI de redirection.
Vous avez stocké en toute sécurité l'ID de votre application. Les applications natives n'utilisent pas de secret client.
Vue d'ensemble du flux d'autorisation
Le flux de code d'autorisation avec PKCE est la méthode recommandée et la plus sécurisée pour les applications natives. Il ajoute une couche de sécurité qui empêche les attaques par interception de code d'autorisation.
Génération de
code_verifieretcode_challenge: Votre application native génère une chaîne aléatoire à haute entropie (lecode_verifier) et une version transformée de celle-ci (lecode_challenge).Initiation de la connexion par l'utilisateur : L'application ouvre un navigateur vers le point de terminaison d'autorisation d'Alibaba Cloud, en transmettant le
code_challengeet sa méthode de transformation.Consentement de l'utilisateur : L'utilisateur se connecte à son compte Alibaba Cloud et accorde à l'application les autorisations demandées.
Réception du code d'autorisation : Le serveur d'autorisation redirige l'utilisateur vers l'URL de redirection spécifiée par l'application avec un code d'autorisation à usage unique.
Échange du code contre des jetons : Votre application envoie une requête au point de terminaison de jeton d'Alibaba Cloud, échangeant le code d'autorisation et le
code_verifierd'origine contre un jeton d'accès et un jeton d'actualisation. Le serveur valide lecode_verifierpar rapport aucode_challengede la première étape.Accès aux ressources protégées : Votre application utilise le jeton d'accès pour effectuer des appels API autorisés vers les services Alibaba Cloud.
Étape 1 : Demander un code d'autorisation avec PKCE
Pour lancer le flux, votre application doit d'abord générer les paramètres PKCE, puis diriger l'utilisateur vers le point de terminaison d'autorisation.
1. Générer les paramètres PKCE
Tout d'abord, votre application crée et enregistre un code_verifier, qui est une chaîne aléatoire cryptographique à haute entropie comprise entre 43 et 128 caractères.
Ensuite, elle crée un code_challenge en transformant le code_verifier à l'aide de l'une des méthodes suivantes :
|
Méthode de transformation |
Description |
|
|
Le |
|
|
(Recommandé) Le |
Exemple utilisant S256 :
Si
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXkAlors
code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
2. Rediriger vers le point de terminaison d'autorisation
Votre application ouvre un navigateur système vers le point de terminaison d'autorisation d'Alibaba Cloud (https://signin.alibabacloud.com/oauth2/v1/auth) avec les paramètres suivants.
|
Paramètre |
Obligatoire |
Description |
|
client_id |
Oui |
L'ID de votre application native. |
|
redirect_uri |
Oui |
L'URI de redirection vers lequel l'utilisateur sera envoyé après avoir accordé son consentement. Celui-ci doit correspondre exactement à l'un des URI enregistrés pour votre application. |
|
response_type |
Oui |
Doit être défini sur |
|
scope |
Non |
Une liste séparée par des espaces des étendues OAuth demandées par votre application. Si omis, toutes les étendues configurées pour l'application sont demandées. |
|
state |
Non |
Une valeur opaque utilisée pour maintenir l'état entre la demande et le rappel. Il est fortement recommandé d'utiliser une chaîne aléatoire et impossible à deviner pour prévenir les attaques par falsification de requête intersite (CSRF). |
|
code_challenge_method |
Non |
La méthode de transformation utilisée. Valeurs valides : Valeur par défaut : |
|
code_challenge |
Non |
La chaîne Remarque
Si vous omettez ce paramètre, PKCE n'est pas utilisé et le flux est vulnérable aux attaques par interception de code d'autorisation. Dans ce cas, un attaquant qui intercepte le code d'autorisation peut l'échanger contre un jeton d'accès. |
|
prompt |
Non |
Définissez ce paramètre sur |
Exemple de requête
https://signin.alibabacloud.com/oauth2/v1/auth?
client_id=98989****
&redirect_uri=meeting%3A%2F%2Fauthorize%2F
&response_type=code
&scope=openid%20%2Fworksuite%2Fuseraccess
&state=123456****
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSst****
&code_challenge_method=S256
Exemple de réponse
Si l'utilisateur accorde son consentement, le serveur d'autorisation redirige le navigateur de l'utilisateur vers votre redirect_uri avec le code d'autorisation et l'état ajoutés en tant que paramètres de requête.
GET HTTP/1.1 302 Found
Location: meeting://authorize/?code=ABAFDGDFXYZW888&state=123456****
Étape 2 : Échanger le code d'autorisation contre un jeton d'accès
Après réception du code d'autorisation, votre application doit envoyer une requête POST depuis son serveur backend vers le point de terminaison de jeton d'Alibaba Cloud (https://oauth.alibabacloud.com/v1/token) pour échanger le code d'autorisation contre des jetons.
Paramètres de la requête (corps POST)
|
Paramètre |
Obligatoire |
Description |
|
code |
Oui |
Le code d'autorisation reçu à l'étape 1. |
|
client_id |
Oui |
L'ID de votre application native. |
|
redirect_uri |
Oui |
Le même URI de redirection que celui utilisé dans la requête de l'étape 1. |
|
grant_type |
Oui |
Doit être défini sur |
|
code_verifier |
Non |
La chaîne |
Exemple de requête
POST /v1/token HTTP/1.1
Host: oauth.alibabacloud.com
Content-Type: application/x-www-form-urlencoded
code=ABAFDGDFXYZW888&
client_id=98989****
redirect_uri=meeting://authorize/&
grant_type=authorization_code&
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
Exemple de réponse
Si la requête aboutit, le point de terminaison de jeton renvoie un objet JSON contenant les jetons.
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "Ccx63VVeTn2dxV7ovXXfLtAqLLERA****",
"id_token": "eyJhbGciOiJIUzI1****"
}
Étape 3 (Facultative) : Actualiser le jeton d'accès
Vous pouvez utiliser le jeton d'actualisation pour obtenir un nouveau jeton d'accès sans obliger l'utilisateur à se reconnecter. Point de terminaison : https://oauth.alibabacloud.com/v1/token
Paramètres de la requête (corps POST)
|
Paramètre |
Obligatoire |
Description |
|
refresh_token |
Oui |
Le jeton d'actualisation que vous avez reçu précédemment. |
|
client_id |
Oui |
L'ID de votre application native. |
|
grant_type |
Oui |
Doit être défini sur |
Exemple de requête
POST /v1/token HTTP/1.1
Host: oauth.alibabacloud.com
Content-Type: application/x-www-form-urlencoded
refresh_token=Ccx63VVeTn2dxV7ovXXfLtAqLLERAH****
client_id=98989****
grant_type=refresh_token
Exemple de réponse
Le point de terminaison de jeton renvoie un nouveau jeton d'accès.
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVuYyI6****",
"token_type": "Bearer",
"expires_in": 3600,
}
Révoquer un jeton d'actualisation
Lorsqu'un utilisateur se déconnecte de votre application ou dissocie son compte, vous devez révoquer le jeton d'actualisation associé pour l'invalider.
Point de terminaison : https://oauth.alibabacloud.com/v1/revoke
Paramètres de la requête (corps POST)
|
Paramètre |
Obligatoire |
Description |
|
token |
Oui |
Le jeton d'actualisation que vous souhaitez révoquer. |
|
client_id |
Oui |
L'ID de votre application native. |
Une requête réussie renvoie un statut HTTP 200 OK.