Référentiel Liberty[8.5.5.4 ou ultérieure]

Octrois d'autorisation JSON Web Token (JWT) pour le client OAuth

Les octrois d'autorisation JWT pour le client OAuth permettent à un client d'envoyer un jeton JWT signé au fournisseur OpenID Connect en échange d'un jeton d'accès OAuth 2.0.

Les octrois d'autorisation JWT pour le client OAuth sont inclus dans la fonction openidConnectServer-1.0. Ils permettent à un client d'envoyer un jeton JWT signé au fournisseur OpenID Connect en échange d'un jeton d'accès OAuth 2.0.

Un exemple de scénario d'utilisation de cette fonctionnalité pourrait être un client d'une compagnie d'électricité qui autorise les paiements mensuels automatiques d'une banque en ligne. L'on suppose que la compagnie d'électricité et la banque en ligne ont établi une relation de confiance à fins de traitement de ces demandes. La compagnie d'électricité peut envoyer un jeton JWT signé avec des demandes appropriées à l'URI de noeud final de jeton du fournisseur OpenID Connect qui est configuré pour que la banque en ligne puisse demander un jeton d'accès OAuth 2.0 chaque mois. La compagnie d'électricité peut ensuite utiliser le jeton d'accès pour encaisser tous les mois les paiements de la banque en ligne.

Des parties de la spécification JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants sont prises en charge pour les serveurs de profil Liberty qui sont configurés en tant que fournisseurs OpenID Connect. Les utilisateurs qui veulent prendre en charge la fonctionnalité client JWT doivent pour cela utiliser leur propre application.

Portées autorisées

Le client OpenID Connect envoie une demande HTTPS avec un jeton JWT au noeud final de jeton du fournisseur OpenID Connect afin de demander un jeton d'accès. Lors de ce processus, l'utilisateur ne voit aucun formulaire d'accord pour autoriser l'utilisation des portées. Le gestionnaire JWT traite les portées autorisées qui reposent sur les critères suivants :

  1. Si aucun paramètre de portée n'est spécifié dans la demande, le fournisseur OpenID Connect n'indiquera aucune portée dans le jeton d'accès.
  2. Lorsqu'un client OpenID Connect est qualifié en tant que client autorisé dans la configuration de fournisseur OpenID Connect, toute portée qui est spécifiée par le client dans la demande est spécifiée dans la liste de portées du jeton d'accès.
  3. Lorsqu'aucun client OpenID Connect n'est qualifié en tant que client autorisé, la portée qui est incluse dans la demande doit être filtrée par la liste de portées dans la configuration client et elle doit aussi être spécifiée dans la liste preAuthorizedScope. Si une portée dans la demande HTTPS est dans la liste scope et preAuthorizeScope de la configuration client, la portée peut être spécifiée dans la liste de portées du jeton d'accès.

Lorsqu'aucun client n'est qualifié en tant que client autorisé, les portées qui peuvent être incluses dans la liste de portées du jeton d'accès doivent être correctement configurées dans la configuration client. La portée doit être incluse dans les valeurs des attributs scope et preAuthorizedScope dans la configuration client pour le fournisseur OpenID Connect. Dans l'exemple fourni, les portées profile et email sont spécifiées dans la liste de portées du jeton d'accès car les deux sont incluses dans liste de valeurs scope et preAuthorizedScope. Si une portée n'est pas répertoriée dans l'attribut scope de la configuration client, elle est omise de la liste de portées du jeton d'accès. Si une portée est répertoriée dans l'attribut scope mais qu'elle n'est pas incluse dans la liste preAuthorizedScope au sein de la configuration client, la demande d'autorisation déclenche une erreur invalid_grant dans la réponse du fournisseur OpenID Connect.

<openidConnectProvider id="OidcConfigSample" oauthProviderRef="OAuthConfigSample" />
<oauthProvider id="OAuthConfigSample" ... >
        ...
        <localStore>            
            <client name="client01" secret="{xor}..."
                    displayname="client01"
                    scope="profile email phone"
                    preAuthorizedScope="profile email"
                    enabled="true" />
            ...
        </localStore>
    </oauthProvider>

Demandes dans un jeton Web JSON

Un jeton Web JSON valide doit être signé. Un serveur de profil Liberty qui est configuré en tant que fournisseur OpenID Connect prend uniquement en charge HMAC-SHA256 comme algorithme de signature de jeton. La clé de signature pour chaque client OpenID Connect est l'attribut secret dans la configuration client du fournisseur OpenID Connect. Dans l'exemple fourni, la clé de signature qui est utilisée serait "{xor}LDo8LTor".

<client name="client01" displayname="client01" secret="{xor}LDo8LTor" ... />

Le fournisseur OpenID Connect vérifie également les demandes suivantes dans un jeton JWT :

'iss' (issuer)
Cette demande est obligatoire dans un jeton JWT. La demande iss doit correspondre à l'attribut name ou redirect de la configuration client dans le fournisseur OpenID Connect. Dans l'exemple suivant, la demande iss doit correspondre à client01 ou http://op201406.ibm.com:8010/oauthclient/redirect.jsp.
<client name="client01" redirect="http://op201406.ibm.com:8010/oauthclient/redirect.jsp" scope="openid profile email" ... />
'sub' (subject)
Cette demande est obligatoire dans un jeton JWT. La valeur du sujet doit être un nom d'utilisateur valide dans le registre d'utilisateurs du serveur du fournisseur OpenID Connect.
'aud' (audience)
Cette demande est obligatoire dans un jeton JWT. La valeur de la demande d'audience est le nom de l'élément issuerIdentifier lorsque l'attribut issuerIdentifier est spécifié dans la configuration openidConnectProvider. Si l'attribut issuerIdentifier n'est pas spécifié dans la configuration openidConnectProvider, l'audience doit être l'URI de noeud final de jeton du fournisseur OpenID Connect. Dans l'exemple suivant, la valeur de la demande d'audience serait "OpenIDConnectProviderID1".
<openidConnectProvider id="OidcConfigSample" oauthProviderRef="OAuthConfigSample" issuerIdentifier="OpenIDConnectProviderID1" />
'exp' (expiration)
Cette demande est obligatoire dans un jeton JWT et elle limite la durée pendant laquelle le jeton JWT peut être utilisé. Le fournisseur OpenID Connect vérifie exp par rapport à son horloge système, plus un décalage d'horloge possible.
'nbf' (not before)
Il s'agit d'une demande facultative. Lorsqu'elle est présente, le jeton n'est valide qu'au terme du délai spécifié par cette demande. Le fournisseur OpenID Connect vérifie ce délai par rapport à son horloge système, plus un décalage d'horloge possible.
'iat' (issued at)
Par défaut, il s'agit d'une demande facultative. Toutefois, si l'attribut iatRequired de l'élément jwtGrantType est défini sur true, tous les jetons JWT doivent obligatoirement contenir la demande iat. Le cas échéant, la demande iat indique l'heure à laquelle le jeton JWT a été émis. Un jeton JWT ne peut pas être émis plus longtemps que maxTokenLifetime.
'jti' (JWT ID)
Il s'agit d'une demande facultative et l'identificateur unique d'un jeton JWT. Lorsqu'elle est présente, le même ID JWT ne peut pas être réutilisé par un émetteur. Par exemple, si client01 émet un jeton JWT dont l'élément jti est id6098364921, aucun autre jeton JWT émis par client01 ne peut avoir la valeur jti id6098364921. Un jeton JWT avec une demande jti identique à un autre jeton JWT est considéré comme une attaque par réinsertion. Les serveurs de profil Liberty qui sont configurés en tant que fournisseurs OpenID Connect définissent un cache jti sur le serveur. La taille du cache est spécifiée par l'élément maxJtiCacheSize dans la configuration jwtGrantType. Les ID jti qui sont conservés dans le cache sont vérifiés par rapport à tout ID jti entrant. Les ID jti stockés dans le cache ne sont pas annulés à moins que le cache ne soit saturé.

Soumission de demandes de jeton Web JSON

Il est recommandé d'utiliser le protocole HTTPS au lieu du protocole HTTP pour soumettre une demande JWT. Le noeud final de jeton du fournisseur OpenID Connect est utilisé pour le traitement des demandes JWT HTTPS. Pour déterminer le noeud final de jeton pour le fournisseur OpenID Connect, voir Appel du noeud final de jeton pour OpenID Connect ou URL de noeud final OAuth.

La demande doit contenir les paramètres suivants :

  • grant_type - La valeur de ce paramètre doit être "urn:ietf:params:oauth:grant-type:jwt-bearer"
  • assertion - La valeur de ce paramètre doit contenir un seul jeton JWT signé.
  • scope - Ce paramètre est facultatif. Si scope est omis, le jeton d'accès qui est retourné ne contient aucune portée. Les valeurs de portée répertoriées dans le paramètre scope sont vérifiées par rapport à la configuration du fournisseur OpenID Connect. Pour plus d'informations, voir la section précédente relative aux portées autorisées.
  • client_id - La valeur de ce paramètre doit correspondre à l'attribut name dans la configuration client du fournisseur OpenID Connect.
  • client_secret - La valeur de ce paramètre doit correspondre à l'attribut secret dans la configuration client du fournisseur OpenID Connect.

Exemple de demande HTTPS :

POST /token.oauth2 HTTP/1.1
    Host: oidc.ibm.com
    Content-Type: application/x-www-form-utlencoded

    client_id=client01
    &client_secret=secret     
    &grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer     
    &assertion=eyJhbGc[---omitted---]kIn0.eyJpc[---ommitted---]A4fQ.MB6ZFlCsHg5MJ-weIHZYz6xgF1jdSZn7ErchHs8-8Rk     
    &scope=profile email

A Java example to create a signed JWT Token:

package com.ibm.sample;

import java.security.SignatureException;
import com.google.gson.JsonObject;
import net.oauth.jsontoken.crypto.HmacSHA256Signer;

import net.oauth.jsontoken.SystemClock;
import net.oauth.jsontoken.JsonToken;
import org.joda.time.Duration;
import org.joda.time.Instant;

public class SampleJWTToken {
        private static final Duration SKEW = Duration.standardMinutes(5);

        JsonToken jwtToken = null;
        String[] allPayloadKeys = { "iss", "sub", "aud", "exp", // required
                                    "nbf", "iat", "jti" }; // optional

        public SampleJWTToken(String clientId, 
                              String keyId,
                              String signKey,
                              String audience, 
                              String subject, // user
                              String jtiId) throws Exception { // InvalidKeyException

                byte[] hs256Key = signKey.getBytes();
                HmacSHA256Signer hmacSha256Signer = new HmacSHA256Signer(
                                clientId, keyId, hs256Key);
                // _rsaSha256Signer = new RsaSHA256Signer(clientId, _keyId,
                //                                        _privateKey);
                SystemClock clock = new SystemClock(SKEW);
                jwtToken = new JsonToken(hmacSha256Signer, clock);
                JsonObject headerObj = jwtToken.getHeader();
                JsonObject payloadObj = jwtToken.getPayloadAsJsonObject();

                headerObj.addProperty("alg", "HS256");

                Instant instantExp = clock.now().plus(600000); // 10 minutes
                jwtToken.setExpiration(instantExp);
                jwtToken.setAudience(audience);
                payloadObj.addProperty("iss", clientId);
                payloadObj.addProperty("sub", subject);

                // optional
                payloadObj.addProperty("jti", jtiId);
                jwtToken.setIssuedAt(clock.now()); // issued at time
        }

        public String getJWTTokenString() throws Exception {
                String signedAndSerializedString = null;
                try {
                        signedAndSerializedString = jwtToken.serializeAndSign();
                } catch (SignatureException e) {
                        throw e;
                }
                return signedAndSerializedString;
        }
}

Icône indiquant le type de rubrique Rubrique de concept

Dispositions pour les centres de documentation | Commentaires


Icône d'horodatage Dernière mise à jour: Wednesday, 2 September 2015
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=cwlp_jwttoken
Nom du fichier : cwlp_jwttoken.html