访问令牌(Access Token)是调用智能语音交互服务的凭证。本文介绍获取访问令牌的方法。
前提条件
已获取AccessKey ID和AccessKey Secret,详情请参见开通服务。
您可以使用阿里云公共SDK调用云端服务获取Access Token(调用时需提供阿里云账号的AccessKey ID和AccessKey Secret)。除此之外,您可根据需求,自行完成获取Access Token的客户端请求,详情请参见获取Token协议说明。
访问令牌使用前需要通过ExpireTime参数获取有效期时间戳,过期需要重新获取。
操作步骤
登录智能语音交互控制台。
默认进入总览,单击点击获取临时AccessToken。
方便快速对接SDK,测试语音服务,该Token仅供测试使用。
调用云端服务的返回示例如下:
{ "NlsRequestId": "aed8c1af075347819118ff6bf811****", "RequestId": "0989F63E-5069-4AB0-822B-5BD2D953****", "Token": { "ExpireTime": 1527592757, "Id": "124fc7526f434b8c8198d6196b0a****", "UserId": "12345678****" } }
其中:
Id为本次分配的访问令牌Access Token。
ExpireTime为此令牌的有效期时间戳,单位:秒。如,
1527592757
换算为北京时间为:2018/5/29 19:19:17
,即Token在该时间之前有效。
异常排查
在调用SDK获取Access Token过程中,出现异常失败需排查问题,请参见错误代码表。
调用方最常见的一个错误描述是:
Request was denied due to user flow control.
,表示接口调用被限流,所以获取Token的请求不宜频繁,否则可能会被阿里云网关拒绝。Access Token获取之后可在有效期内多次使用(跨线程、跨进程、跨机器)。
移动端获取Token
推荐在服务端集成下方提供的SDK,获取访问令牌。
在服务端集成Java SDK,通过HTTP GET实现*/gettoken接口。
客户端访问*/gettoken接口获取Token A和有效时间。
使用Token A访问语音服务。每次调用语音服务之前都获取新的Token。
在本地缓存Token,如下次访问在Token A的有效时间内,直接使用Token A;若Token A已经过期,获取新的Token并更新本地缓存。
通过SDK获取Token
调用示例(Java)
从Maven服务器下载最新版本SDK,下载demo源码ZIP包。
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-common</artifactId>
<version>2.1.6</version>
</dependency>
AccessToken token = new AccessToken("your akID", "your akSecret");
token.apply();
String accessToken = token.getToken();
long expireTime = token.getExpireTime();
以上Java代码是用在服务端的,Android使用需要在服务端/pc上运行获取Token,出于安全考虑,建议您搭建服务端,客户端请求服务端更新Token。
调用示例(C++)
Linux下安装工具要求如下:
Glibc 2.5及以上
Gcc4或Gcc5
Windows下:VS2013或VS2015
Windows平台需要您自己搭建工程。
编译示例。
假设示例文件已解压至
path/to
路径下,在Linux终端依次执行如下命令编译运行程序。支持Cmake:
确认本地系统已安装Cmake2.4及以上版本。
切换目录:
cd path/to/sdk/lib
。解压缩文件:
tar -zxvpf linux.tar.gz
。切换目录:
cd path/to/sdk
。执行编译脚本:
./build.sh
。切换目录:
cd path/to/sdk/demo
。执行获取Token示例:
./tokenDemo <yourAccessKeySecret> <yourAccessKeyId>
。
不支持Cmake:
切换目录:
cd path/to/sdk/lib
。解压缩文件:
tar -zxvpf linux.tar.gz
。切换目录:
cd path/to/sdk/demo
。使用g++编译命令编译示例程序:
g++ -o tokenDemo tokenDemo.cpp -I path/to/sdk/include/ -L path/to/sdk/lib/linux -ljsoncpp -lssl -lcrypto -lcurl -luuid -lnlsCommonSdk -D_GLIBCXX_USE_CXX11_ABI=0
。指定库路径:
export LD_LIBRARY_PATH=path/to/sdk/lib/linux/
。执行获取Token示例:
./tokenDemo <yourAccessKeySecret> <yourAccessKeyId>
。
调用服务。
获取访问令牌Token的示例代码如下:
#include <iostream> #include "Token.h" using std::cout; using std::endl; using namespace AlibabaNlsCommon; //获取访问令牌TokenId int getTokenId(const char* keySecret, const char* keyId) { NlsToken nlsTokenRequest; /*设置阿里云账号KeySecret*/ nlsTokenRequest.setKeySecret(keySecret); /*设置阿里云账号KeyId*/ nlsTokenRequest.setAccessKeyId(keyId); /*获取Token. 成功返回0, 失败返回-1*/ if (-1 == nlsTokenRequest.applyNlsToken()) { cout << "Failed: " << nlsTokenRequest.getErrorMsg() << endl; /*获取失败原因*/ return -1; } else { cout << "TokenId: " << nlsTokenRequest.getToken() << endl; /*获取TokenId*/ cout << "TokenId expireTime: " << nlsTokenRequest.getExpireTime() << endl; /*获取Token有效期时间戳(秒)*/ return 0; } }
调用示例(PHP)
如下使用是阿里云新版PHP SDK,请参见Alibaba Cloud SDK for PHP。如果您已接入阿里云旧版PHP SDK,参见aliyun-openapi-php-sdk,仍然可以继续使用或者更新到新版SDK。
安装前请确保环境使用的是PHP 5.5及以上版本,PHP SDK安装方式请参见安装Alibaba Cloud SDK for PHP 。
调用步骤:
创建一个全局客户端。
创建API请求,设置参数。
发起请求,处理应答或异常。
<?php
require __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
/**
* 第一步:设置一个全局客户端
* 使用阿里云RAM账号的AccessKey ID和AccessKey Secret进行鉴权。
*/
AlibabaCloud::accessKeyClient(
"<your-access-key-id>",
"<your-access-key-secret>")
->regionId("ap-southeast-1")
->asDefaultClient();
try {
$response = AlibabaCloud::nlsCloudMeta()
->v20180518()
->createToken()
->request();
print $response . "\n";
$token = $response["Token"];
if ($token != NULL) {
print "Token 获取成功:\n";
print_r($token);
}
else {
print "token 获取失败\n";
}
} catch (ClientException $exception) {
// 获取错误消息
print_r($exception->getErrorMessage());
} catch (ServerException $exception) {
// 获取错误消息
print_r($exception->getErrorMessage());
}
通过CommonRequest获取Token
使用阿里云公共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)
添加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.83</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.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)
使用pip安装SDK。
执行以下命令,通过pip安装Python SDK,版本为2.13.3。
pip install aliyun-python-sdk-core==2.13.3 # 安装阿里云SDK核心库
调用服务。
示例代码如下:
# -*- 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", "<yourAccessKey Id>", "<yourAccessKey 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)
安装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,请参见GitHub下载SDK。
调用服务。
示例代码如下:
var RPCClient = require('@alicloud/pop-core').RPCClient; var client = new RPCClient({ accessKeyId: '<yourAccessKey Id>', accessKeySecret: '<yourAccessKey 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)
安装.NET SDK。
获取Token的.NET示例使用了阿里云.NET SDK的CommonRequest用来提交获取Token的请求,采用的是RPC风格的POP API调用。阿里云.NET SDK的详细介绍请参见使用.NET SDK。
.NET SDK CommonRequest的使用方法,请参见使用CommonRequest进行调用。
您只需安装阿里云.NET SDK的核心库。可以选择添加DLL引用或者项目引入任一种方式安装.NET SDK,详细操作步骤请参见使用.NET SDK。
调用服务。
示例代码如下:
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", "<yourAccessKey Id>", "<yourAccessKey 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"; // 发起请求,并得到响应。 CommonResponse response = client.GetCommonResponse(request); System.Console.WriteLine(response.Data); }sl catch (ServerException ex) { System.Console.WriteLine(ex.ToString()); } catch (ClientException ex) { System.Console.WriteLine(ex.ToString()); } } }