Générez des jetons côté serveur afin de ne pas exposer les identifiants AccessKey à long terme dans les applications mobiles. Le SDK signe les requêtes. L’application doit stocker les jetons, vérifier leur date d’expiration et en obtenir de nouveaux avant qu’ils n’expirent.
Contexte
Choisissez la méthode adaptée au SDK utilisé dans votre projet. Un seul des deux SDK est nécessaire.
|
Méthode |
Cas d’utilisation |
|
NLS SDK |
Utilisez la classe de demande de jeton si le SDK correspondant est déjà intégré. |
|
Alibaba Cloud common SDK |
Appelez |
Configurer les identifiants
Un compte avec le service Intelligent Speech Interaction activé et une paire AccessKey disposant des autorisations requises sont nécessaires. Pour activer le service et configurer les identifiants, consultez Commencer ici.
Les demandes de jeton utilisent une paire AccessKey, et non une clé API Model Studio. Définissez les identifiants dans l’environnement du processus qui exécute l’exemple : ALIYUN_AK_ID pour l’AccessKey ID et ALIYUN_AK_SECRET pour l’AccessKey Secret.
Conservez les identifiants AccessKey dans un environnement serveur de confiance, et non dans le code source ou les applications mobiles. Avant d’appeler un service vocal, une application mobile demande un jeton au serveur d’application. Les exemples affichent uniquement le résultat et la date d’expiration, sans révéler le jeton. Ne journalisez pas les identifiants AccessKey, les jetons ni les requêtes signées complètes.
Obtenir un jeton avec un NLS SDK
Java
Ajoutez les dépendances Maven. L’exemple utilise nls-sdk-common 2.1.6. L’API JAXB est également requise pour exécuter l’exemple sur JDK 21.
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-common</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
Appelez apply() pour envoyer la requête. Ensuite, appelez getToken() et getExpireTime() pour récupérer le jeton et sa date d’expiration. Cette classe de demande n’actualise pas automatiquement les jetons selon une planification.
import com.alibaba.nls.client.AccessToken;
public class NlsTokenDemo {
public static void main(String[] args) throws Exception {
AccessToken request = new AccessToken(
System.getenv("ALIYUN_AK_ID"),
System.getenv("ALIYUN_AK_SECRET"),
"nlsmeta.ap-southeast-1.aliyuncs.com",
"ap-southeast-1", "2019-07-17");
request.apply();
String token = request.getToken();
long expireTime = request.getExpireTime();
System.out.println("Token acquired: " + (token != null && !token.isEmpty()));
System.out.println("ExpireTime (Unix seconds): " + expireTime);
}
}
Obtenir un jeton avec un SDK commun Alibaba Cloud
Les requêtes RPC effectuées via un SDK commun utilisent les paramètres suivants. Utilisez conjointement l'endpoint, la région et la version de l'API tels qu'indiqués ; ne modifiez pas uniquement l'un d'entre eux.
|
Paramètre |
Valeur |
Description |
|
|
|
Endpoint du service de jetons. |
|
|
|
Région de la requête. |
|
|
|
Opération API. |
|
|
|
Version de l'API RPC. |
Java
Ajoutez les dépendances Maven. L'exemple utilise aliyun-java-sdk-core 3.7.1 et fastjson 1.2.83. JDK 21 nécessite également JAXB API 2.3.1.
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
public class CreateTokenDemo {
public static void main(String[] args) throws Exception {
DefaultProfile profile = DefaultProfile.getProfile(
"ap-southeast-1", System.getenv("ALIYUN_AK_ID"),
System.getenv("ALIYUN_AK_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setDomain("nlsmeta.ap-southeast-1.aliyuncs.com");
request.setVersion("2019-07-17");
request.setAction("CreateToken");
request.setMethod(MethodType.POST);
request.setProtocol(ProtocolType.HTTPS);
CommonResponse response = client.getCommonResponse(request);
JSONObject result = JSON.parseObject(response.getData()).getJSONObject("Token");
String token = result.getString("Id");
long expireTime = result.getLongValue("ExpireTime");
System.out.println("Token acquired: " + (token != null && !token.isEmpty()));
System.out.println("ExpireTime (Unix seconds): " + expireTime);
}
}
Python
Installez la dépendance. L'exemple utilise aliyun-python-sdk-core 2.15.1.
pip install aliyun-python-sdk-core
import json
import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
client = AcsClient(
os.environ["ALIYUN_AK_ID"],
os.environ["ALIYUN_AK_SECRET"],
"ap-southeast-1",
)
request = CommonRequest()
request.set_method("POST")
request.set_protocol_type("https")
request.set_domain("nlsmeta.ap-southeast-1.aliyuncs.com")
request.set_version("2019-07-17")
request.set_action_name("CreateToken")
result = json.loads(client.do_action_with_exception(request))
token = result["Token"]["Id"]
expire_time = result["Token"]["ExpireTime"]
print("Token acquired:", bool(token))
print("ExpireTime (Unix seconds):", expire_time)
Go
Installez la dépendance dans un module Go. L'exemple utilise alibaba-cloud-sdk-go 1.63.107.
go get github.com/aliyun/alibaba-cloud-sdk-go/sdk
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)
func main() {
credential := credentials.NewAccessKeyCredential(
os.Getenv("ALIYUN_AK_ID"), os.Getenv("ALIYUN_AK_SECRET"))
client, err := sdk.NewClientWithOptions("ap-southeast-1", sdk.NewConfig(), credential)
if err != nil {
panic(err)
}
request := requests.NewCommonRequest()
request.Scheme = "HTTPS"
request.Method = "POST"
request.Domain = "nlsmeta.ap-southeast-1.aliyuncs.com"
request.ApiName = "CreateToken"
request.Version = "2019-07-17"
response, err := client.ProcessCommonRequest(request)
if err != nil {
panic(err)
}
var result struct {
Token struct {
Id string
ExpireTime int64
}
}
if err := json.Unmarshal(response.GetHttpContentBytes(), &result); err != nil {
panic(err)
}
token := result.Token.Id
fmt.Println("Token acquired:", token != "")
fmt.Println("ExpireTime (Unix seconds):", result.Token.ExpireTime)
}
PHP
Utilisez PHP 7.2 ou une version ultérieure et installez la dépendance avec Composer. L'exemple utilise alibabacloud/sdk 1.8.2345 et alibabacloud/client 1.5.32.
composer require alibabacloud/sdk
Cet exemple utilise une requête RPC commune et définit explicitement l'endpoint, la version de l'API et la méthode HTTP.
<?php
require __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
AlibabaCloud::accessKeyClient(
getenv('ALIYUN_AK_ID'), getenv('ALIYUN_AK_SECRET'))
->regionId('ap-southeast-1')
->asDefaultClient();
$response = AlibabaCloud::rpc()
->product('nls-cloud-meta')
->version('2019-07-17')
->action('CreateToken')
->host('nlsmeta.ap-southeast-1.aliyuncs.com')
->scheme('https')
->method('POST')
->request();
$token = $response['Token']['Id'];
$expireTime = $response['Token']['ExpireTime'];
echo 'Token acquired: ' . (!empty($token) ? 'true' : 'false') . PHP_EOL;
echo 'ExpireTime (Unix seconds): ' . $expireTime . PHP_EOL;
Node.js
Installez la dépendance. L'exemple utilise @alicloud/pop-core 1.8.0.
npm install @alicloud/pop-core
const { RPCClient } = require('@alicloud/pop-core');
const client = new RPCClient({
accessKeyId: process.env.ALIYUN_AK_ID,
accessKeySecret: process.env.ALIYUN_AK_SECRET,
endpoint: 'https://nlsmeta.ap-southeast-1.aliyuncs.com',
apiVersion: '2019-07-17',
});
async function main() {
const result = await client.request('CreateToken', {}, { method: 'POST' });
const token = result.Token.Id;
const expireTime = result.Token.ExpireTime;
console.log('Token acquired:', Boolean(token));
console.log('ExpireTime (Unix seconds):', expireTime);
}
main().catch((error) => {
console.error('CreateToken failed:', error.code || error.name);
process.exitCode = 1;
});
Réponse et notes d'utilisation
Une fois qu'une requête SDK standard aboutit, lisez les champs suivants dans l'objet Token de la réponse. Le NLS SDK pour Java renvoie ces valeurs via les méthodes correspondantes.
|
Champ |
Type |
Description |
|
|
String |
La chaîne de jeton pour les requêtes ultérieures adressées au service vocal. Dans le NLS SDK pour Java, utilisez |
|
|
Long |
L'heure d'expiration sous forme d'horodatage Unix en secondes. Dans le NLS SDK pour Java, utilisez |
Mettez en cache et réutilisez un jeton tant qu'il est valide, au lieu d'en obtenir un avant chaque requête adressée au service vocal. Utilisez la valeur
ExpireTimerenvoyée pour déterminer quand le jeton expire. Obtenez un nouveau jeton et mettez à jour le cache avant l'expiration. Ne remplacez pas la valeur renvoyée par une durée fixe.Plusieurs processus ou applications dans un environnement de confiance peuvent utiliser le même jeton. Obtenez les jetons depuis l'endpoint configuré dans ces exemples. N'interchangez pas les jetons émis par les endpoints de Shanghai et de Singapour.
Transmettez la chaîne
Idau service vocal, et non la réponse JSON complète, les identifiants AccessKey ou un autre champ. Transmettez le jeton à l'emplacement requis par le protocole d'authentification de l'API vocale.
FAQ
Comment résoudre les échecs de requête de jeton ?
Utilisez le code d'erreur renvoyé par le SDK pour identifier la cause. Une paire AccessKey incorrecte n'est pas la seule cause des erreurs d'authentification.
|
Code d'erreur |
Dépannage |
|
|
Vérifiez que l'AccessKey ID est correct, qu'il appartient à l'identité prévue et qu'il ne contient aucun espace ajouté lors de la copie. |
|
|
Vérifiez que l'AccessKey ID et l'AccessKey secret forment une paire correspondante et que les paramètres signés n'ont pas été modifiés. Utilisez un SDK standard pour construire les requêtes au lieu d'assembler manuellement les signatures. |
|
|
Vérifiez que l'horloge du système demandeur est synchronisée avec l'heure standard. Cette erreur concerne l'horodatage de la requête, et non l'expiration d'un jeton émis. |
|
|
Vérifiez l'endpoint et la version de l'API, et distinguez les requêtes RPC des requêtes ROA. Le style de requête PHP doit correspondre à sa version d'API. |
Que faire si une API vocale signale un jeton invalide ?
Le code 40000001 indique une erreur d'authentification lors de l'appel d'un service vocal. Vérifiez que la chaîne de jeton réelle et tous les paramètres d'authentification requis sont fournis, que le jeton n'a pas expiré et que son endpoint d'émission correspond à la configuration du service. Le même code d'erreur peut avoir plusieurs causes ; vérifiez le message d'erreur complet.
Comment résoudre l'erreur « Not supported proxy scheme » ?
Vérifiez les variables http_proxy et https_proxy, ainsi que les proxys configurés dans l'application. Utilisez un protocole de proxy pris en charge par le SDK et vérifiez l'adresse du proxy, le port et la disponibilité. Si le réseau ne nécessite pas de proxy, supprimez les paramètres de proxy et réessayez.
Rubriques connexes
Pour construire directement des requêtes signées, consultez la rubrique Obtenir un jeton à l'aide d'OpenAPI.