OpenID Connect (OIDC) est une couche d'identité basée sur OAuth 2.0 qui permet à votre application d'obtenir des informations sur les utilisateurs connectés à Alibaba Cloud.
Prérequis
Assurez-vous d'avoir effectué les tâches suivantes : Créer une application, Gérer les étendues OAuth et Créer un secret client.
Concepts clés
|
Concept |
Description |
|
Jeton d'identité (ID token) |
Le service OIDC émet un jeton d'identité représentant l'utilisateur connecté. Ce jeton contient des informations telles que le nom et le nom de connexion, mais ne permet pas d'accéder aux services Alibaba Cloud. |
|
Endpoint de découverte OIDC |
L'endpoint de découverte OIDC centralise toute la configuration OIDC, ce qui simplifie l'intégration pour les développeurs. Remarque
L'endpoint de découverte renvoie un document JSON contenant les métadonnées du fournisseur, notamment les types de réponse pris en charge, la valeur de l'émetteur, l'URL de la clé publique pour la vérification de la signature du jeton d'identité et les algorithmes de signature pris en charge. Endpoint de découverte OIDC d'Alibaba Cloud : Exemple de réponse de l'endpoint de découverte :
|
Fonctionnement

Un utilisateur se connecte à l'application depuis un navigateur.
-
Votre application redirige le navigateur de l'utilisateur vers le service OIDC d'Alibaba Cloud.
RemarqueSi l'utilisateur n'est pas connecté, la requête est redirigée vers le service de connexion d'Alibaba Cloud.
L'utilisateur se connecte à Alibaba Cloud et autorise votre application.
Le service OIDC d'Alibaba Cloud redirige le navigateur de l'utilisateur vers votre application en fournissant un code d'autorisation.
Votre application échange le code d'autorisation contre un jeton d'identité auprès du service OIDC d'Alibaba Cloud.
-
Le service OIDC d'Alibaba Cloud renvoie un jeton d'identité et un jeton d'accès à l'application. L'application peut ensuite obtenir les informations utilisateur en utilisant soit le jeton d'identité, soit le jeton d'accès.
Cas d'utilisation courants :
-
Analysez directement le jeton d'identité pour obtenir les informations utilisateur.
L'application doit vérifier la signature du jeton d'identité : obtenez les clés publiques (Exemple 1 : Obtenir la clé publique de signature), vérifiez la signature JWT (Exemple 2 : Vérifier la signature JWT), puis analysez les informations utilisateur (Exemple 3 : Analyser un jeton d'identité).
-
Utilisez le jeton d'identité pour la communication entre différents modules.
L'application doit vérifier la signature du jeton d'identité : obtenez les clés publiques (Exemple 1 : Obtenir la clé publique de signature) et vérifiez la signature JWT (Exemple 2 : Vérifier la signature JWT).
-
Utilisez le jeton d'accès pour interroger plusieurs fois les informations utilisateur.
Après avoir obtenu le jeton d'accès, l'application appelle l'endpoint UserInfo pour récupérer les informations utilisateur (Exemple 4 : Utiliser l'endpoint UserInfo).
-
Exemple 1 : Obtenir la clé publique de signature
Exemple de requête :
private List getSignPublicKey() {
HttpResponse response = HttpClientUtils.doGet("https://oauth.alibabacloud.com/v1/keys");
List rsaKeyList = new ArrayList();
if (response.getCode() == 200 && response.isSuccess()) {
String keys = JSON.parseObject(response.getData()).getString("keys");
try {
JSONArray publicKeyList = JSON.parseArray(keys);
for (Object object : publicKeyList) {
RSAKey rsaKey = RSAKey.parse(JSONObject.toJSONString(object));
rsaKeyList.add(rsaKey);
}
return rsaKeyList;
} catch (Exception e) {
LOG.info(e.getMessage());
}
}
LOG.info("GetSignPublicKey failed:{}", response.getData());
throw new AuthenticationException(response.getData());
}
Exemple 2 : Vérifier la signature JWT
Les jetons d'identité d'Alibaba Cloud sont des JSON Web Tokens (JWT) signés. L'algorithme de signature est RS256, tel que défini par la norme JWS. Validez chaque jeton d'identité en vérifiant les points suivants :
-
Validation de la signature : utilisez les clés publiques du service OAuth (Exemple 1) pour vérifier l'authenticité et l'intégrité du jeton d'identité.
Le service OAuth fait régulièrement tourner ses clés publiques. Lors de l'obtention des clés publiques :
Récupérez les clés publiques à chaque requête. Ne les mettez pas en cache à long terme.
Pendant la rotation des clés, le service peut renvoyer plusieurs clés valides. Essayez chaque clé jusqu'à ce que l'une d'elles vérifie la signature. Ne supposez pas un nombre fixe de clés.
Exemple de requête :
public boolean verifySign(SignedJWT signedJWT) { List publicKeyList = getSignPublicKey(); RSAKey rsaKey = null; for (RSAKey key : publicKeyList) { if (signedJWT.getHeader().getKeyID().equals(key.getKeyID())) { rsaKey = key; } } if (rsaKey != null) { try { RSASSAVerifier verifier = new RSASSAVerifier(rsaKey.toRSAPublicKey()); if (signedJWT.verify(verifier)) { return true; } } catch (Exception e) { LOG.info("Verify exception:{}", e.getMessage()); } } throw new AuthenticationException("Can't verify signature for id token"); } Validation de la durée de vie : vérifiez que l'heure d'émission et l'heure d'expiration du jeton sont valides.
Validation de l'audience : vérifiez que la revendication aud correspond à l'ID client de votre application.
Exemple 3 : Analyser un jeton d'identité
-
Paramètres de réponse
-
Revendications d'en-tête
Paramètre
Description
Étendue OAuth
alg
L'algorithme de signature.
openid
kid
L'ID de la clé publique utilisée pour signer le jeton. Utilisez cette clé pour vérifier la signature et prévenir toute falsification.
openid
-
Revendications de corps
Paramètre
Description
Étendue OAuth
exp
L'horodatage indiquant l'heure d'expiration du jeton.
openid
sub
Un identifiant unique et stable pour l'utilisateur connecté. Il ne contient pas d'informations telles que l'UID Alibaba Cloud ou le nom d'utilisateur.
RemarqueSi l'utilisateur connecté est un rôle RAM, la revendication sub est générée à partir de
<RoleId:RoleSessionName>. Chaque session de rôle possède sa propre valeur sub.openid
aud
L'audience du jeton, qui correspond à l'ID client de votre application.
openid
iss
L'émetteur du jeton. La valeur est https://oauth.alibabacloud.com.
openid
iat
L'horodatage indiquant quand le jeton a été émis.
openid
type
Le type de l'utilisateur connecté. Valeurs valides :
-
account : un compte Alibaba Cloud (compte principal).
-
user : un utilisateur RAM.
-
role : un rôle RAM.
profile
name
Le nom d'affichage de l'utilisateur connecté. Valeurs valides :
-
Pour un utilisateur RAM : le nom d'affichage de l'utilisateur RAM.
-
Pour un rôle RAM :
<RoleName:RoleSessionName>.
RemarqueCette revendication est renvoyée uniquement pour un utilisateur RAM ou un rôle RAM.
profile
upn
Le nom de connexion de l'utilisateur RAM.
RemarqueCette revendication est renvoyée uniquement pour un utilisateur RAM.
profile
login_name
Le nom de connexion du compte Alibaba Cloud (compte principal).
RemarqueCette revendication est renvoyée uniquement pour un compte Alibaba Cloud (compte principal).
profile
aid
L'ID du compte Alibaba Cloud auquel appartient l'utilisateur.
aliuid
uid
L'ID de l'utilisateur connecté. Valeurs valides :
-
Pour un compte Alibaba Cloud (compte principal) : l'ID du compte Alibaba Cloud, qui est identique à la valeur aid.
-
Pour un utilisateur RAM : l'ID de l'utilisateur RAM.
-
Pour un rôle RAM : l'ID du rôle RAM.
aliuid
-
-
-
Exemples de réponse
-
Exemple d'en-tête
{ "alg": "RS256", "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****" } -
Exemples de corps
Ces exemples montrent les charges utiles décodées des jetons d'identité. Le jeton réel est une chaîne JWT encodée unique qui doit être vérifiée (Exemple 2 : Vérifier la signature JWT).
-
Exemple de charge utile pour un compte Alibaba Cloud
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "account", "login_name":"alice@example.com", // The login name of the Alibaba Cloud account "aid": "123456789012****", // The ID of the Alibaba Cloud account "uid": "123456789012****" // The ID of the Alibaba Cloud account } -
Exemple de charge utile pour un utilisateur RAM
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "user", "name": "alice", // The display name of the RAM user "upn": "alice@example.onaliyun.com", // The login name of the RAM user "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM user belongs "uid": "234567890123****" // The ID of the RAM user } -
Exemple de charge utile pour un rôle RAM
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "role", "name": "NetworkAdministrator:alice", // The display name of the RAM role "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM role belongs "uid": "300800165472****" // The ID of the RAM role }
-
-
Exemple 4 : Utiliser l'endpoint UserInfo
Vous pouvez appeler l'endpoint UserInfo avec un jeton d'accès pour récupérer les informations utilisateur. La réponse est renvoyée au format JSON brut, et non sous forme de jeton encodé.
Même si vous ne demandez que les étendues openid, aliuid et profile, un jeton d'accès est renvoyé. Ce jeton est limité à l'endpoint UserInfo.
L'URL de l'endpoint UserInfo est https://oauth.alibabacloud.com/v1/userinfo.
Exemple de requête :
GET v1/userinfo HTTP/1.1
Host: oauth.alibabacloud.com
Authorization: Bearer SIAV32hkKG
Paramètres de réponse :
|
Paramètre |
Description |
Étendue OAuth |
|
sub |
Un identifiant unique et stable pour l'utilisateur connecté. Il ne contient pas d'informations telles que l'UID Alibaba Cloud ou le nom d'utilisateur. |
openid |
|
type |
Le type de l'utilisateur connecté. |
profile |
|
name |
Le nom d'affichage de l'utilisateur connecté. Remarque
Ce paramètre est renvoyé uniquement pour un utilisateur RAM ou un rôle RAM. |
profile |
|
upn |
Le nom de connexion de l'utilisateur RAM. Remarque
Ce paramètre est renvoyé uniquement pour un utilisateur RAM. |
profile |
|
login_name |
Le nom de connexion du compte Alibaba Cloud (compte principal). Remarque
Ce paramètre est renvoyé uniquement pour un compte Alibaba Cloud (compte principal). |
profile |
|
aid |
L'ID du compte Alibaba Cloud auquel appartient l'utilisateur. |
aliuid |
|
uid |
L'ID de l'utilisateur connecté. |
aliuid |
Exemples de réponse :
-
Exemple de réponse pour un compte Alibaba Cloud
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "account", "login_name":"alice@example.com", // The login name of the Alibaba Cloud account "aid": "123456789012****", // The ID of the Alibaba Cloud account "uid": "123456789012****" // The ID of the Alibaba Cloud account } -
Exemple de réponse pour un utilisateur RAM
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "user", "name": "alice", // The display name of the RAM user "upn": "alice@example.onaliyun.com", // The login name of the RAM user "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM user belongs "uid": "234567890123****" // The ID of the RAM user } -
Exemple de réponse pour un rôle RAM
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "role", "name": "NetworkAdministrator:alice", // The display name of the RAM role "aid": "123456789012****", // The ID of the Alibaba Cloud account to which the RAM role belongs "uid": "300800165472****" // The ID of the RAM role }