Token——带有效期的访问凭证
访问令牌(Access Token)是调用智能语音服务的凭证。您可以使用阿里云公共SDK调用云端服务获取Access Token。调用时需要提供您阿里云账号的AccessKey ID和AccessKey Secret。除此之外,如果您可根据需求,请阅读获取Token协议说明自行实现获取Token的客户端请求。
访问令牌使用前需要通过ExpireTime参数获取有效期时间戳,过期则需要重新获取。
在管控台点击总览 > 获取AccessToken,可获取用于测试的Token,方便快速对接SDK,测试语音服务,获取的token仅供测试使用。
调用云端服务的返回示例如下:
{
"NlsRequestId": "aed8c1af075347819118ff6bf8111168",
"RequestId": "0989F63E-5069-4AB0-822B-5BD2D95356DF",
"Token": {
"ExpireTime": 1527592757,
"Id": "124fc7526f434b8c8198d6196b0a1c8e",
"UserId": "123456789012"
}
}
其中:
- Token->Id 为本次分配的访问令牌Access token
- Token->ExpireTime 为此令牌的有效期时间戳(单位:秒,例如1527592757换算为北京时间为:2018/5/29 19:19:17,即token在该时间之前有效。)
常见错误排查
在调用SDK获取Access Token过程中,出现异常失败,可以参考错误状态说明排查解决。
重要提示:
- 调用token时可能会失败,请一定查看错误状态说明中的错误状态说明,以便调整代码;
- 调用方最常见的一个错误描述是:“Request was denied due to user flow control.”,这个表示接口调用被限流了,也即:token的请求不宜频繁,否则可能会被阿里云网关拒绝;
- token获取一次之后可以多次使用(跨线程、跨进程、跨机器都可以复用同一token),且在有效期内一直可以使用,因此不建议频繁调用token获取接口;
移动端获取
推荐您在服务端集成下方提供的SDK,获取访问令牌。
经典场景:
- 在服务端集成 Java SDK,通过 http GET实现 */gettoken 接口。
- 客户端访问 */gettoken 接口获取 token A和有效时间。
- 使用 token A 访问语音服务。每次调用语音服务之前都拉取新的 token。
- 在本地缓存 token,如下次访问在 token A 的有效时间内,直接使 用 token A;若 token A 已经过期,拉取新的 token 并更新本地缓存。
通过CommonRequest获取
使用阿里云公共SDK获取Access token,建议采用RPC风格的API调用。发起一次RPC风格的CommonAPI请求,您需要提供以下几个参数:
参数名 | 参数值 | 说明 |
---|---|---|
domain | nlsmeta.ap-southeast-1.aliyuncs.com | 即该产品的通用访问域名,固定值 |
region_id | ap-southeast-1 | 服务的地域ID,固定值 |
action | CreateToken | 该API的名称,固定值 |
version | 2019-07-17 | 该API的版本号,固定值 |
调用示例(Java)
1.添加Java依赖
您只需依赖阿里云Java SDK的核心库(版本为3.7.1)和fastjson库:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
<!-- http://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
2.调用服务
获取访问令牌的示例代码如下:
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.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CreateTokenDemo {
// 您的地域ID
private static final String REGIONID = "ap-southeast-1";
// 获取Token服务域名
private static final String DOMAIN = "nlsmeta.ap-southeast-1.aliyuncs.com";
// API 版本
private static final String API_VERSION = "2019-07-17";
// API名称
private static final String REQUEST_ACTION = "CreateToken";
// 响应参数
private static final String KEY_TOKEN = "Token";
private static final String KEY_ID = "Id";
private static final String KEY_EXPIRETIME = "ExpireTime";
public static void main(String args[]) throws ClientException {
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];
// 创建DefaultAcsClient实例并初始化
DefaultProfile profile = DefaultProfile.getProfile(
REGIONID,
accessKeyId,
accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setDomain(DOMAIN);
request.setVersion(API_VERSION);
request.setAction(REQUEST_ACTION);
request.setMethod(MethodType.POST);
request.setProtocol(ProtocolType.HTTPS);
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
if (response.getHttpStatus() == 200) {
JSONObject result = JSON.parseObject(response.getData());
String token = result.getJSONObject(KEY_TOKEN).getString(KEY_ID);
long expireTime = result.getJSONObject(KEY_TOKEN).getLongValue(KEY_EXPIRETIME);
System.out.println("获取到的Token: " + token + ",有效期时间戳(单位:秒): " + expireTime);
// 将10位数的时间戳转换为北京时间
String expireDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(expireTime * 1000));
System.out.println("Token有效期的北京时间:" + expireDate);
}
else {
System.out.println("获取Token失败!");
}
}
}
调用示例(Python)
1.使用pip安装SDK
执行以下命令,通过pip安装Python SDK,版本为2.13.3:
pip install aliyun-python-sdk-core==2.13.3 # 安装阿里云SDK核心库
说明:文档会定期更新最新可支持获取token的SDK版本,您已经安装使用的SDK版本可继续使用。
2.示例代码
# -*- coding: utf8 -*-
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
# 创建AcsClient实例
client = AcsClient(
"<您的AccessKey Id>",
"<您的AccessKey Secret>",
"ap-southeast-1"
);
# 创建request,并设置参数
request = CommonRequest()
request.set_method('POST')
request.set_domain('nlsmeta.ap-southeast-1.aliyuncs.com')
request.set_version('2019-07-17')
request.set_action_name('CreateToken')
response = client.do_action_with_exception(request)
print(response)
调用示例(GO)
示例代码:
package main
import (
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)
func main() {
client, err := sdk.NewClientWithAccessKey("ap-southeast-1", "<您的AccessKey Id>", "<您的AccessKey Secret>")
if err != nil {
panic(err)
}
request := requests.NewCommonRequest()
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)
}
fmt.Print(response.GetHttpStatus())
fmt.Print(response.GetHttpContentString())
}
调用示例(Node.js)
1.安装Node.js SDK
建议您使用npm来完成Node.js依赖模块的安装,所有阿里云官方的Node.js SDK 都位于 @alicloud 下。
假设Node.js SDK下载后的路径为 /path/to/aliyun-openapi-Node.js-sdk。当基于SDK核心库进行开发时,请执行以下命令安装@alicloud/pop-core模块。
命令中的—save会将模块写入应用的package.json文件中,作为依赖模块。
$ npm install @alicloud/pop-core --save
另外,也可以从GitHub下载SDK。
2.示例代码
var RPCClient = require('@alicloud/pop-core').RPCClient;
var client = new RPCClient({
accessKeyId: '<您的AccessKey Id>',
accessKeySecret: '<您的AccessKey Secret>',
endpoint: 'http://nlsmeta.ap-southeast-1.aliyuncs.com',
apiVersion: '2019-07-17'
});
// => returns Promise
// => request(Action, params, options)
client.request('CreateToken').then((result) => {
console.log(result.Token);
});
调用示例(.NET)
1.安装.NET SDK
获取Token的.NET Demo使用了阿里云.NET SDK的CommonRequest用来提交获取Token的请求,采用的是RPC风格的POP API调用。阿里云.NET SDK的详细介绍请阅读阿里云.Net SDK使用手册,.NET SDK CommonRequest的使用方法请阅读使用CommonReques进行调用。
您只需安装阿里云.NET SDK的核心库即可。您可以使用添加DLL引用或者项目引入方式两种方式安装.NET SDK,具体的安装方式 请阅读使用.NET SDK文档。
2.示例代码
using System;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Exceptions;
using Aliyun.Acs.Core.Profile;
class Sample
{
static void Main(string[] args)
{
// 构建一个客户端实例,用于发起请求
IClientProfile profile = DefaultProfile.GetProfile(
"ap-southeast-1",
"<您的AccessKey Id>",
"<您的AccessKey Secret>");
DefaultAcsClient client = new DefaultAcsClient(profile);
try
{
// 构造请求
CommonRequest request = new CommonRequest();
request.Domain = "nlsmeta.ap-southeast-1.aliyuncs.com";
request.Version = "2019-07-17";
// 因为是 RPC 风格接口,需指定 ApiName(Action)
request.Action = "CreateToken";
// 发起请求,并得到 Response
CommonResponse response = client.GetCommonResponse(request);
System.Console.WriteLine(response.Data);
}
catch (ServerException ex)
{
System.Console.WriteLine(ex.ToString());
}
catch (ClientException ex)
{
System.Console.WriteLine(ex.ToString());
}
}
}