Tous les produits
Search
Centre de documentation

:Obtenir un jeton d'accès en appelant une opération API

Dernière mise à jour :Aug 09, 2026

Cette rubrique explique comment obtenir un jeton d'accès en appelant une opération API.

Requête

Le client envoie une requête au serveur pour obtenir un jeton d'accès. Le serveur crée un jeton d'accès, puis renvoie une réponse au client. Le client peut utiliser la méthode GET ou POST pour envoyer des requêtes HTTP ou HTTPS. Le serveur fournit l'API Portable OpenAPI Proxy (POP). Par conséquent, le client doit utiliser le mécanisme de signature POP d'Alibaba Cloud pour signer chaque requête.

Les paramètres de requête sont identiques pour HTTP et HTTPS. Cette rubrique utilise HTTP comme exemple pour expliquer comment envoyer une requête afin d'obtenir un jeton d'accès.

  • URL

    Protocole

    URL

    Méthode

    HTTP/1.1

    http://nlsmeta.ap-southeast-1.aliyuncs.com/

    GET/POST

  • Paramètres de requête

    Paramètre

    Type

    Obligatoire

    Description

    AccessKeyId

    String

    Oui

    L'ID AccessKey du compte Alibaba Cloud.

    Action

    String

    Oui

    L'opération API à exécuter. Définissez ce paramètre sur CreateToken.

    Version

    String

    Oui

    Le numéro de version de l'API POP. Définissez ce paramètre sur 2019-02-28.

    Format

    String

    Oui

    Le format de la réponse. Définissez ce paramètre sur JSON.

    RegionId

    String

    Oui

    L'ID de région du service. Définissez ce paramètre sur ap-southeast-1.

    Timestamp

    String

    Oui

    L'horodatage de la requête. Spécifiez l'heure selon la norme ISO 8601 au format yyyy-MM-ddTHH:mm:ssZ. L'heure doit être en UTC+0. Par exemple, une valeur de 2019-04-03T06:15:03Z correspond au 3 avril 2019 à 06:15:03.

    SignatureMethod

    String

    Oui

    L'algorithme de signature. Définissez ce paramètre sur HMAC-SHA1.

    SignatureVersion

    String

    Oui

    Le numéro de version de l'algorithme de signature. Définissez ce paramètre sur 1,0.

    SignatureNonce

    String

    Oui

    Un nombre aléatoire unique utilisé pour prévenir les attaques par rejeu. Vous devez utiliser des nombres différents pour chaque requête. La valeur est au format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12). Exemple : 8d1e6a7a-f44e-40d5-aedb-fe4a1c80f434.

    Signature

    String

    Oui

    La chaîne de signature calculée à partir de tous les paramètres de requête. Pour plus d'informations sur la méthode de calcul de la signature, consultez la section Mécanisme de signature.

    Remarque
    • Si vous utilisez la méthode GET, ajoutez les paramètres de requête à la ligne de requête au format suivant : /?chaîne de paramètres de requête.

    • Si vous utilisez la méthode POST, ajoutez les paramètres de requête au corps de la requête.

  • En-tête de requête HTTP

    L'en-tête de requête HTTP se compose de paires clé-valeur. Chaque paire clé-valeur est un champ qui occupe une ligne. La clé et la valeur de chaque paire sont séparées par deux points (:). Le tableau suivant décrit les champs de l'en-tête de requête HTTP.

    Paramètre

    Type

    Obligatoire

    Description

    Host

    String

    Non

    L'endpoint du service Intelligent Speech Interaction demandé. Définissez ce champ sur nlsmeta.ap-southeast-1.aliyuncs.com. Cet endpoint est généralement résolu automatiquement en fonction de l'URL de la requête.

    Accept

    String

    Non

    Le type de contenu que le client peut recevoir. Définissez ce champ sur application/json. Si vous ne spécifiez pas ce champ, la valeur par défaut / est utilisée.

    Content-type

    String

    Oui pour la méthode POST

    Le format de données du corps de la requête si la méthode POST est utilisée. Définissez ce champ sur application/x-www-form-urlencoded.

Exemples de requêtes :

  • Requête HTTP GET

    GET /?Signature=O0s6pfeOxtFM6YKSZKQdSyPR9Vs%3D&AccessKeyId=LTAF3sAA****&Action=CreateToken&Format=JSON&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=a1f01895-6ff1-43c1-ba15-6c109fa00106&SignatureVersion=1.0&Timestamp=2019-03-27T09%3A51%3A25Z&Version=2019-02-28 HTTP/1.1
    Host: nlsmeta.ap-southeast-1.aliyuncs.com
    User-Agent: curl/7.49.1
    Accept: */*
  • Requête HTTP POST

    POST / HTTP/1.1
    Host: nlsmeta.ap-southeast-1.aliyuncs.com
    User-Agent: curl/7.49.1
    Accept: */*
    Content-type: application/x-www-form-urlencoded
    Content-Length: 276
    
    SignatureVersion=1.0&Action=CreateToken&Format=JSON&SignatureNonce=8d1e6a7a-f44e-40d5-aedb-fe4a1c80f434&Version=2019-02-28&AccessKeyId=LTAF3sAA****&Signature=oT8A8RgvFE1tMD%2B3hDbGuoMQSi8%3D&SignatureMethod=HMAC-SHA1&RegionId=ap-southeast-1&Timestamp=2019-03-25T09%3A07%3A52Z

Réponses :

Après l'envoi d'une requête HTTP par le client pour obtenir un jeton d'accès, le serveur renvoie une réponse. Le résultat est stocké sous forme de chaîne JSON dans la réponse. La réponse est identique pour les méthodes GET et POST.

  • Réponse en cas de succès

    Le code d'état HTTP est 200. Le tableau suivant décrit les paramètres de réponse.

    Paramètre

    Type

    Description

    Token

    Object

    L'objet token qui contient le jeton d'accès et l'horodatage indiquant la période de validité du jeton d'accès.

    Id

    String

    Le jeton d'accès attribué à la requête.

    ExpireTime

    Long

    L'horodatage indiquant la période de validité du jeton d'accès. Unité : secondes. Par exemple, une valeur de 1553825814 indique que le jeton d'accès est valide jusqu'au 29 mars 2019 à 10:16:54 (UTC+8).

    HTTP/1.1 200 OK
    Date: Mon, 25 Mar 2019 09:29:24 GMT
    Content-Type: application/json; charset=UTF-8
    Content-Length: 216
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Access-Control-Allow-Headers: X-Requested-With, X-Sequence, _aop_secret, _aop_signature
    Access-Control-Max-Age: 172800
    Server: Jetty(7.2.2.v20101205)
    
    {"NlsRequestId":"dd05a301b40441c99a2671905325****","RequestId":"E11F2DC2-0163-4D97-A704-0BD28045****","ErrMsg":"","Token":{"ExpireTime":1553592564,"Id":"88916699****","UserId":"150151111111****"}}

    Le code suivant montre le corps de la réponse au format JSON :

    {
        "NlsRequestId": "dd05a301b40441c99a2671905325****",
        "RequestId": "E11F2DC2-0163-4D97-A704-0BD28045****",
        "ErrMsg": "",
        "Token": {
            "ExpireTime": 1553592564,
            "Id": "889******166",
            "UserId": "150**********151"
        }
    }
  • Réponse d'erreur

    Le code d'état HTTP n'est pas 200. Le tableau suivant décrit les paramètres de réponse.

    Paramètre

    Type

    Description

    RequestId

    String

    L'ID de la requête.

    Message

    String

    Le message d'erreur de la réponse d'erreur.

    Code

    String

    Le code d'erreur de la réponse d'erreur.

    Remarque

    Vérifiez si les paramètres de requête sont correctement définis en fonction du code d'erreur et du message d'erreur.

    L'exemple suivant montre une réponse d'erreur causée par un ID AccessKey non valide :

    HTTP/1.1 404 Not Found
    Date: Thu, 28 Mar 2019 07:23:01 GMT
    Content-Type: application/json; charset=UTF-8
    Content-Length: 290
    Connection: keep-alive
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Access-Control-Allow-Headers: X-Requested-With, X-Sequence, _aop_secret, _aop_signature
    Access-Control-Max-Age: 172800
    Server: Jetty(7.2.2.v20101205)
    
    {"Recommend":"https://error-center.aliyun.com/status/search?Keyword=InvalidAccessKeyId.NotFound&source=PopGw","Message":"Specified access key is not found.","RequestId":"A51587CB-5193-4DB8-9AED-CD4365C2****","HostId":"nlsmeta.ap-southeast-1.aliyuncs.com","Code":"InvalidAccessKeyId.NotFound"}

    Le code suivant montre le corps de la réponse au format JSON :

    {
        "Recommend": "https://error-center.aliyun.com/status/search?Keyword=InvalidAccessKeyId.NotFound&source=PopGw",
        "Message": "Specified access key is not found.",
        "RequestId": "A51587CB-5193-4DB8-9AED-CD4365C2****",
        "HostId": "nlsmeta.ap-southeast-1.aliyuncs.com",
        "Code": "InvalidAccessKeyId.NotFound"
    }

Méthode de signature

Lorsque le serveur reçoit une requête API POP, il authentifie l'identité de l'appelant de l'API. Par conséquent, la requête HTTP ou HTTPS doit contenir des informations de signature. Grâce au mécanisme de signature, le serveur peut identifier l'utilisateur qui envoie la requête API et confirmer si la requête API a été altérée pendant la transmission réseau.

Processus de vérification de sécurité

Intelligent Speech Interaction utilise l'algorithme HMAC-SHA1 pour mettre en œuvre un chiffrement symétrique basé sur l'ID AccessKey et le secret AccessKey de votre compte Alibaba Cloud. Le processus suivant montre comment vérifier une requête API :

  1. Le client génère une chaîne de signature basée sur le contenu d'une requête API qui inclut les paramètres de requête HTTP et le corps de la requête.

  2. Le client utilise l'ID AccessKey et le secret AccessKey de votre compte Alibaba Cloud pour chiffrer la chaîne de signature générée à l'étape 1. Ensuite, le client obtient une signature numérique pour cette requête API.

  3. Le client envoie la requête API signée au serveur.

  4. Après avoir reçu la requête API, le serveur répète les étapes 1 et 2 pour calculer la signature numérique attendue pour la requête API. Le serveur peut obtenir l'ID AccessKey et le secret AccessKey utilisés par la requête API depuis le backend.

  5. Le serveur compare la signature numérique attendue avec la signature numérique envoyée par le client. Si les signatures sont identiques, la requête passe la vérification de sécurité. Si les signatures sont différentes, le serveur rejette la requête API.

Générer une chaîne de signature pour une requête API

  1. Créez une chaîne de requête normalisée.

    Créez une chaîne de requête normalisée basée sur les paramètres de requête HTTP, mais n'incluez pas le paramètre Signature. Pour créer une chaîne de requête normalisée, effectuez les étapes suivantes :

    1. Triez les paramètres de requête par ordre alphabétique. Les noms des paramètres sont sensibles à la casse.

    2. Encodez les paramètres. Normalisez les paramètres de requête triés.

      Encodez les noms et les valeurs des paramètres de requête en UTF-8 selon les règles suivantes :

      • Les lettres majuscules, les lettres minuscules, les chiffres et certains caractères spéciaux tels que les traits d'union (-), les traits de soulignement (_), les points (.) et les tildes (~) n'ont pas besoin d'être encodés.

      • Les autres caractères doivent être encodés en pourcentage au format %XY. XY représente le code ASCII des caractères en notation hexadécimale. Par exemple, les guillemets doubles (") sont encodés en %22.

      • Les caractères UTF-8 étendus doivent être encodés au format %XY%ZA….

      • Les espaces doivent être encodés en %20. N'encodez pas les espaces en signes plus (+).

      Remarque

      La plupart des bibliothèques qui prennent en charge l'encodage URL, telles que java.net.URLEncoder, sont créées sur la base des règles d'encodage de application/x-www-form-urlencoded. application/x-www-form-urlencoded est un sous-type de Multipurpose Internet Mail Extensions (MIME). Si vous utilisez cette méthode d'encodage, vous pouvez remplacer un signe plus (+) par %20, un astérisque (*) par %2A, et %7E par un tilde (~) dans la chaîne encodée pour obtenir la chaîne requise.

    3. Utilisez un signe égal (=) pour connecter le nom et la valeur de chaque paramètre de requête encodé en URL. Exemple : percentEncode (clé du paramètre) + "=" + percentEncode (valeur du paramètre).

    4. Utilisez une esperluette (&) pour connecter les paires clé-valeur des paramètres de requête encodés en URL générés à l'étape c. Exemple : Action=CreateToken&Format=JSON.

      Remarque

      N'ajoutez pas d'esperluette (&) avant le premier nom de paramètre de la chaîne de requête normalisée.

    5. Renvoyez la chaîne de requête normalisée.

    Exemple de code :

    String percentEncode(String value) throws UnsupportedEncodingException {
        return value != null ? URLEncoder.encode(value, URL_ENCODING)
                .replace("+", "%20")
                .replace("*", "%2A")
                .replace("%7E", "~") : null;
    }
    
    // Sort the parameter keys.
    String[] sortedKeys = queryParamsMap.keySet().toArray(new String[] {});
    Arrays.sort(sortedKeys);
    
    // Encode and concatenate the sorted request parameters.
    for (String key : sortedKeys) {
        canonicalizedQueryString.append("&")
                .append(percentEncode(key)).append("=")
                .append(percentEncode(queryParamsMap.get(key)));
    }
    queryString = canonicalizedQueryString.toString().substring(1);
    Remarque

    Pour plus d'informations sur l'exemple de code complet, consultez la fonction canonicalizedQuery dans la section Exemple de code complet.

    La chaîne de requête normalisée suivante est créée :

    AccessKeyId=LTA******3s2&Action=CreateToken&Format=JSON&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=f20b1beb-e5dc-4245-9e96-aa582e905c1a&SignatureVersion=1.0&Timestamp=2019-04-03T03%3A40%3A13Z&Version=2019-02-28
  2. Créez une chaîne à signer.

    Une chaîne à signer se compose de la méthode de requête HTTP, de l'URL encodée en URL et de la chaîne de requête normalisée encodée en URL obtenue à l'étape 1. Utilisez des esperluettes (&) pour concaténer ces éléments au format suivant : HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(queryString).

    L'exemple de code suivant montre comment créer une chaîne à signer :

    StringBuilder strBuilderSign = new StringBuilder();
    strBuilderSign.append(HTTPMethod);
    strBuilderSign.append("&");
    strBuilderSign.append(percentEncode(urlPath));
    strBuilderSign.append("&");
    strBuilderSign.append(percentEncode(queryString));
    
    stringToSign = strBuilderSign.toString();
    Remarque

    Pour plus d'informations sur l'exemple de code complet, consultez la fonction createStringToSign dans la section Exemple de code complet.

    La chaîne à signer suivante est créée :

    String-to-sign

  3. Calculez la signature.

    • Utilisez l'algorithme HMAC-SHA1 et Base64 pour calculer la valeur HMAC de la chaîne à signer. Ensuite, encodez la valeur HMAC calculée en UTF-8.

    • Utilisez l'algorithme SHA1 pour calculer la valeur HMAC de la chaîne à signer créée à l'étape 2. Le secret AccessKey est utilisé comme clé pour le calcul HMAC. Vous devez ajouter une esperluette (&) après le secret AccessKey.

    • Effectuez l'encodage URL pour la signature calculée.

    L'exemple de code suivant montre comment calculer la signature :

    signature = Base64( HMAC-SHA1(stringToSign, accessKeySecret + "&") );
    // Perform URL encoding
    signature = percentEncode(signature)
    Remarque

    Pour plus d'informations sur l'exemple de code complet, consultez la fonction sign dans la section Exemple de code complet.

    La signature suivante est calculée :

    # The HMAC value of the string-to-sign
    AKIktdPUMCV12fTh667BLXeuCtg=
    # The URL encoded signature
    AKIktdPUMCV12fTh667BLXeuCtg%3D

    Après le calcul de la signature, utilisez un signe égal (=) pour connecter la clé et la valeur du paramètre Signature. Ensuite, utilisez une esperluette (&) pour connecter le paramètre Signature et la chaîne de requête normalisée obtenue à l'étape 1. Ensuite, le client peut envoyer la requête HTTP GET signée au serveur pour obtenir un jeton d'accès.

    String queryStringWithSign = "Signature=" + signature + "&" + queryString;

Test rapide

Utilisez les paramètres suivants pour calculer une signature et tester la signature calculée.

Remarque

L'ID AccessKey et le secret AccessKey ne sont pas réels. L'horodatage a expiré. Vous ne pouvez pas obtenir de jeton d'accès en utilisant la signature calculée basée sur ces paramètres. Ces paramètres sont utilisés uniquement pour calculer et tester une signature.

  • AccessKeyId :

    my_access_key_id

  • AccessKeySecret :

    my_access_key_secret

  • Timestamp :

    2019-04-18T08:32:31Z

  • SignatureNonce :

    b924c8c3-6d03-4c5d-ad36-d984d3116788

Les paramètres de requête suivants sont utilisés :

AccessKeyId:my_access_key_id
Action:CreateToken
Version:2019-02-28
Timestamp:2019-04-18T08:32:31Z
Format:JSON
RegionId:ap-southeast-1
SignatureMethod:HMAC-SHA1
SignatureVersion:1.0
SignatureNonce:b924c8c3-6d03-4c5d-ad36-d984d3116788
  1. Créez une chaîne de requête normalisée.

    AccessKeyId=my_access_key_id&Action=CreateToken&Format=JSON&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=b924c8c3-6d03-4c5d-ad36-d984d3116788&SignatureVersion=1.0&Timestamp=2019-04-18T08%3A32%3A31Z&Version=2019-02-28
  2. Créez une chaîne à signer.

    String-to-sign

  3. Calculez et obtenez la signature.

    hHq4yNsPitlfDJ2L0nQPdugdEzM=
    # The URL encoded signature
    hHq4yNsPitlfDJ2L0nQPdugdEzM%3D
  4. Ajoutez la signature à la chaîne de requête normalisée.

    Signature=hHq4yNsPitlfDJ2L0nQPdugdEzM%3D&AccessKeyId=my_access_key_id&Action=CreateToken&Format=JSON&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=b924c8c3-6d03-4c5d-ad36-d984d3116788&SignatureVersion=1.0&Timestamp=2019-04-18T08%3A32%3A31Z&Version=2019-02-28
  5. Obtenez l'URL de la requête HTTP.

    http://nlsmeta.ap-southeast-1.aliyuncs.com/?Signature=hHq4yNsPitlfDJ2L0nQPdugdEzM%3D&AccessKeyId=my_access_key_id&Action=CreateToken&Format=JSON&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=b924c8c3-6d03-4c5d-ad36-d984d3116788&SignatureVersion=1.0&Timestamp=2019-04-18T08%3A32%3A31Z&Version=2019-02-28
  6. Saisissez l'URL de la requête HTTP obtenue à l'étape 5 dans la barre d'adresse de votre navigateur ou exécutez la commande curl suivante pour obtenir un jeton d'accès.

    curl "http://nlsmeta.ap-southeast-1.aliyuncs.com/?Signature=${Your signature}&AccessKeyId=${Your AccessKey ID}&Action=CreateToken&Format=JSON&RegionId=ap-southeast-1&SignatureMethod=HMAC-SHA1&SignatureNonce=${Your request UUID}&SignatureVersion=1.0&Timestamp=${Your request timestamp}&Version=2019-02-28"

Exemple de code complet

Remarque

Cette section fournit l'exemple de code pour Java et Python. Vous pouvez écrire le code pour les programmes clients dans d'autres langages en vous basant sur ces protocoles et exemples de code.

  • Démo pour Java

    Ajoutez la dépendance suivante :

    <!-- http://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.83</version>
    </dependency>
    
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>3.9.1</version>
    </dependency>

    Exemple de code :

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.SimpleTimeZone;
    import java.util.UUID;
    public class CreateToken {
        private final static String TIME_ZONE = "GMT";
        private final static String FORMAT_ISO8601 = "yyyy-MM-dd'T'HH:mm:ss'Z'";
        private final static String URL_ENCODING = "UTF-8";
        private static final String ALGORITHM_NAME = "HmacSHA1";
        private static final String ENCODING = "UTF-8";
        private static String token = null;
        private static long expireTime = 0;
        /**
         * Obtain the timestamp.
         * Specify the time in the ISO 8601 standard in the yyyy-MM-ddTHH:mm:ssZ format. The time must be in UTC+0. 
         */
        public static String getISO8601Time(Date date) {
            Date nowDate = date;
            if (null == date) {
                nowDate = new Date();
            }
            SimpleDateFormat df = new SimpleDateFormat(FORMAT_ISO8601);
            df.setTimeZone(new SimpleTimeZone(0, TIME_ZONE));
            return df.format(nowDate);
        }
        /**
         * Obtain the UUID of the request.
         */
        public static String getUniqueNonce() {
            UUID uuid = UUID.randomUUID();
            return uuid.toString();
        }
        /**
         * Perform URL encoding.
         * Use UTF-8 to encode the names and values of the request parameters based on RFC 3986. 
         */
        public static String percentEncode(String value) throws UnsupportedEncodingException {
            return value != null ? URLEncoder.encode(value, URL_ENCODING).replace("+", "%20")
                    .replace("*", "%2A").replace("%7E", "~") : null;
        }
        /***
         * Sort the request parameters and concatenate the sorted request parameters to create a canonicalized query string. 
         * @param queryParamsMap   All request parameters.
         * @return The canonicalized query string.
         */
        public static String canonicalizedQuery( Map<String, String> queryParamsMap) {
            String[] sortedKeys = queryParamsMap.keySet().toArray(new String[] {});
            Arrays.sort(sortedKeys);
            String queryString = null;
            try {
                StringBuilder canonicalizedQueryString = new StringBuilder();
                for (String key : sortedKeys) {
                    canonicalizedQueryString.append("&")
                            .append(percentEncode(key)).append("=")
                            .append(percentEncode(queryParamsMap.get(key)));
                }
                queryString = canonicalizedQueryString.toString().substring(1);
                System.out.println("Canonicalized query string: " + queryString);
            } catch (UnsupportedEncodingException e) {
                System.out.println("UTF-8 encoding is not supported.");
                e.printStackTrace();
            }
            return queryString;
        }
        /***
         * Create a string-to-sign.
         * @param method       The HTTP request method.
         * @param urlPath      The HTTP request URL.
         * @param queryString  The canonicalized query string.
         * @return The string-to-sign.
         */
        public static String createStringToSign(String method, String urlPath, String queryString) {
            String stringToSign = null;
            try {
                StringBuilder strBuilderSign = new StringBuilder();
                strBuilderSign.append(method);
                strBuilderSign.append("&");
                strBuilderSign.append(percentEncode(urlPath));
                strBuilderSign.append("&");
                strBuilderSign.append(percentEncode(queryString));
                stringToSign = strBuilderSign.toString();
                System.out.println("string-to-sign: " + stringToSign);
            } catch (UnsupportedEncodingException e) {
                System.out.println("UTF-8 encoding is not supported.");
                e.printStackTrace();
            }
            return stringToSign;
        }
        /***
         * Calculate the signature.
         * @param stringToSign      The string-to-sign.
         * @param accessKeySecret   The AccessKey secret that is appended with an ampersand (&).
         * @return The calculated signature.
         */
        public static String sign(String stringToSign, String accessKeySecret) {
            try {
                Mac mac = Mac.getInstance(ALGORITHM_NAME);
                mac.init(new SecretKeySpec(
                        accessKeySecret.getBytes(ENCODING),
                        ALGORITHM_NAME
                ));
                byte[] signData = mac.doFinal(stringToSign.getBytes(ENCODING));
                String signBase64 = DatatypeConverter.printBase64Binary(signData);
                System.out.println("Calculated signature: " + signBase64);
                String signUrlEncode = percentEncode(signBase64);
                System.out.println("URL encoded signature: " + signUrlEncode);
                return signUrlEncode;
            } catch (NoSuchAlgorithmException e) {
                throw new IllegalArgumentException(e.toString());
            } catch (UnsupportedEncodingException e) {
                throw new IllegalArgumentException(e.toString());
            } catch (InvalidKeyException e) {
                throw new IllegalArgumentException(e.toString());
            }
        }
        /***
         * Send an HTTP GET request to obtain an access token and the timestamp that indicates the validity period of the access token. 
         * @param queryString The request parameters.
         */
        public static void processGETRequest(String queryString) {
            /**
             * Create an HTTP GET request.
             * 1. Use HTTP.
             * 2. Use the endpoint of Intelligent Speech Interaction: nlsmeta.ap-southeast-1.aliyuncs.com
             * 3. Request URL: /
             * 4. Set the request parameters.
             */
            String url = "http://nlsmeta.ap-southeast-1.aliyuncs.com";
            url = url + "/";
            url = url + "?" + queryString;
            System.out.println("HTTP request URL: " + url);
            Request request = new Request.Builder()
                    .url(url)
                    .header("Accept", "application/json")
                    .get()
                    .build();
            try {
                OkHttpClient client = new OkHttpClient();
                Response response = client.newCall(request).execute();
                String result = response.body().string();
                if (response.isSuccessful()) {
                    JSONObject rootObj = JSON.parseObject(result);
                    JSONObject tokenObj = rootObj.getJSONObject("Token");
                    if (tokenObj != null) {
                        token = tokenObj.getString("Id");
                        expireTime = tokenObj.getLongValue("ExpireTime");
                    }
                    else{
                        System.err.println("Failed to send the request to obtain an access token: " + result);
                    }
                }
                else {
                    System.err.println("Failed to send the request to obtain an access token: " + result);
                }
                response.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void main(String args[]) {
            if (args.length < 2) {
                System.err.println("CreateTokenDemo need params: <AccessKey Id> <AccessKey Secret>");
                System.exit(-1);
            }
            String accessKeyId = args[0];
            String accessKeySecret = args[1];
            System.out.println(getISO8601Time(null));
            // All request parameters.
            Map<String, String> queryParamsMap = new HashMap<String, String>();
            queryParamsMap.put("AccessKeyId", accessKeyId);
            queryParamsMap.put("Action", "CreateToken");
            queryParamsMap.put("Version", "2019-02-28");
            queryParamsMap.put("Timestamp", getISO8601Time(null));
            queryParamsMap.put("Format", "JSON");
            queryParamsMap.put("RegionId", "ap-southeast-1");
            queryParamsMap.put("SignatureMethod", "HMAC-SHA1");
            queryParamsMap.put("SignatureVersion", "1.0");
            queryParamsMap.put("SignatureNonce", getUniqueNonce());
            /**
             * 1. Create a canonicalized query string.
             */
            String queryString = canonicalizedQuery(queryParamsMap);
            if (null == queryString) {
                System.out.println("Failed to create the canonicalized query string.");
                return;
            }
            /**
             * 2. Create a string-to-sign.
             */
            String method = "GET";  // The HTTP request method, such as GET.
            String urlPath = "/";   // The HTTP request URL.
            String stringToSign = createStringToSign(method, urlPath, queryString);
            if (null == stringToSign) {
                System.out.println("Failed to create the string-to-sign.");
                return;
            }
            /**
             * 3. Calculate the signature.
             */
            String signature = sign(stringToSign, accessKeySecret + "&");
            if (null == signature) {
                System.out.println("Failed to calculate the signature.")
                return;
            }
            /**
             * 4. Add the signature to the canonicalized query string that is obtained in Step 1.
             */
            String queryStringWithSign = "Signature=" + signature + "&" + queryString;
            System.out.println("Query string that contains the signature: " + queryStringWithSign);
            /**
             * 5. Send the HTTP GET request to obtain an access token. 
             */
            processGETRequest(queryStringWithSign);
            if (token != null) {
                System.out.println("Obtained token: " + token + ", Timestamp of the validity period (unit: seconds): "+ expireTime);
                // Convert the 10-digit timestamp to a time in UTC+8.
                String expireDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(expireTime * 1000));
                System.out.println("Validity period of the access token in UTC+8: " + expireDate);
            }
        }
    }
  • Démo pour Python

    Remarque
    • La version de Python doit être Python 3.4 ou ultérieure.

    • Exécutez la commande suivante pour installer la bibliothèque HTTP Python Requests :

       pip install requests
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import base64
    import hashlib
    import hmac
    import requests
    import time
    import uuid
    from urllib import parse
    class AccessToken:
        @staticmethod
        def _encode_text(text):
            encoded_text = parse.quote_plus(text)
            return encoded_text.replace('+', '%20').replace('*', '%2A').replace('%7E', '~')
        @staticmethod
        def _encode_dict(dic):
            keys = dic.keys()
            dic_sorted = [(key, dic[key]) for key in sorted(keys)]
            encoded_text = parse.urlencode(dic_sorted)
            return encoded_text.replace('+', '%20').replace('*', '%2A').replace('%7E', '~')
        @staticmethod
        def create_token(access_key_id, access_key_secret):
            parameters = {'AccessKeyId': access_key_id,
                          'Action': 'CreateToken',
                          'Format': 'JSON',
                          'RegionId': 'ap-southeast-1',
                          'SignatureMethod': 'HMAC-SHA1',
                          'SignatureNonce': str(uuid.uuid1()),
                          'SignatureVersion': '1.0',
                          'Timestamp': time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
                          'Version': '2019-02-28'}
            # Create a canonicalized query string.
            query_string = AccessToken._encode_dict(parameters)
            print('Canonicalized query string: %s' % query_string)
            # Create a string-to-sign.
            string_to_sign = 'GET' + '&' + AccessToken._encode_text('/') + '&' + AccessToken._encode_text(query_string)
            print('string-to-sign: %s' % string_to_sign)
            # Calculate the signature.
            secreted_string = hmac.new(bytes(access_key_secret + '&', encoding='utf-8'),
                                       bytes(string_to_sign, encoding='utf-8'),
                                       hashlib.sha1).digest()
            signature = base64.b64encode(secreted_string)
            print('Signature: %s' % signature)
            // Encode the calculated signature.
            signature = AccessToken._encode_text(signature)
            print('URL encoded signature: %s' % signature)
            # Create an HTTP GET request.
            full_url = 'http://nlsmeta.ap-southeast-1.aliyuncs.com/?Signature=%s&%s' % (signature, query_string)
            print('url: %s' % full_url)
            # Send the HTTP GET request.
            response = requests.get(full_url)
            if response.ok:
                root_obj = response.json()
                key = 'Token'
                if key in root_obj:
                    token = root_obj[key]['Id']
                    expire_time = root_obj[key]['ExpireTime']
                    return token, expire_time
            print(response.text)
            return None, None
    if __name__ == "__main__":
        # The user information.
        access_key_id = 'Your AccessKey ID'
        access_key_secret = 'Your AccessKey secret'
        token, expire_time = AccessToken.create_token(access_key_id, access_key_secret)
        print('token: %s, expire time(s): %s' % (token, expire_time))
        if expire_time:
            print('Validity period of the token in UTC+8: %s' % (time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(expire_time))))