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.
RemarqueSi 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.
RemarqueVé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 :
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.
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.
Le client envoie la requête API signée au serveur.
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.
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
-
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 :
Triez les paramètres de requête par ordre alphabétique. Les noms des paramètres sont sensibles à la casse.
-
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-8selon 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 (
+).
RemarqueLa 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%7Epar un tilde (~) dans la chaîne encodée pour obtenir la chaîne requise. 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).-
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.RemarqueN'ajoutez pas d'esperluette (
&) avant le premier nom de paramètre de la chaîne de requête normalisée. 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);RemarquePour plus d'informations sur l'exemple de code complet, consultez la fonction
canonicalizedQuerydans 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 -
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();RemarquePour plus d'informations sur l'exemple de code complet, consultez la fonction
createStringToSigndans la section Exemple de code complet.La chaîne à signer suivante est créée :

-
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)RemarquePour plus d'informations sur l'exemple de code complet, consultez la fonction
signdans 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%3DAprè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.
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
-
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 -
Créez une chaîne à signer.

-
Calculez et obtenez la signature.
hHq4yNsPitlfDJ2L0nQPdugdEzM= # The URL encoded signature hHq4yNsPitlfDJ2L0nQPdugdEzM%3D -
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 -
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 -
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
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
RemarqueLa 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))))