全部产品
Search
文档中心

获取 Token

更新时间: 2020-11-03

Token——带有效期的访问凭证

访问令牌(Access Token)是调用智能语音服务的凭证。您可以使用阿里云公共SDK调用云端服务获取Access Token。调用时需要提供您阿里云账号的AccessKey ID和AccessKey Secret。除此之外,如果您可根据需求,请阅读获取Token协议说明自行实现获取Token的客户端请求。

访问令牌使用前需要通过ExpireTime参数获取有效期时间戳,过期则需要重新获取。

在管控台点击总览 > 获取AccessToken,可获取用于测试的Token,方便快速对接SDK,测试语音服务,获取的token仅供测试使用。

调用云端服务的返回示例如下:

  1. {
  2. "NlsRequestId": "aed8c1af075347819118ff6bf8111168",
  3. "RequestId": "0989F63E-5069-4AB0-822B-5BD2D95356DF",
  4. "Token": {
  5. "ExpireTime": 1527592757,
  6. "Id": "124fc7526f434b8c8198d6196b0a1c8e",
  7. "UserId": "123456789012"
  8. }
  9. }

其中:

  • Token->Id 为本次分配的访问令牌Access token
  • Token->ExpireTime 为此令牌的有效期时间戳(单位:秒,例如1527592757换算为北京时间为:2018/5/29 19:19:17,即token在该时间之前有效。)

常见错误排查

在调用SDK获取Access Token过程中,出现异常失败,可以参考错误状态说明排查解决。

重要提示:

  1. 调用token时可能会失败,请一定查看错误状态说明中的错误状态说明,以便调整代码;
  2. 调用方最常见的一个错误描述是:“Request was denied due to user flow control.”,这个表示接口调用被限流了,也即:token的请求不宜频繁,否则可能会被阿里云网关拒绝;
  3. 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库:

  1. <dependency>
  2. <groupId>com.aliyun</groupId>
  3. <artifactId>aliyun-java-sdk-core</artifactId>
  4. <version>3.7.1</version>
  5. </dependency>
  6. <!-- http://mvnrepository.com/artifact/com.alibaba/fastjson -->
  7. <dependency>
  8. <groupId>com.alibaba</groupId>
  9. <artifactId>fastjson</artifactId>
  10. <version>1.2.49</version>
  11. </dependency>

2.调用服务

获取访问令牌的示例代码如下:

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.aliyuncs.CommonRequest;
  4. import com.aliyuncs.CommonResponse;
  5. import com.aliyuncs.DefaultAcsClient;
  6. import com.aliyuncs.IAcsClient;
  7. import com.aliyuncs.exceptions.ClientException;
  8. import com.aliyuncs.http.MethodType;
  9. import com.aliyuncs.http.ProtocolType;
  10. import com.aliyuncs.profile.DefaultProfile;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. public class CreateTokenDemo {
  14. // 您的地域ID
  15. private static final String REGIONID = "ap-southeast-1";
  16. // 获取Token服务域名
  17. private static final String DOMAIN = "nlsmeta.ap-southeast-1.aliyuncs.com";
  18. // API 版本
  19. private static final String API_VERSION = "2019-07-17";
  20. // API名称
  21. private static final String REQUEST_ACTION = "CreateToken";
  22. // 响应参数
  23. private static final String KEY_TOKEN = "Token";
  24. private static final String KEY_ID = "Id";
  25. private static final String KEY_EXPIRETIME = "ExpireTime";
  26. public static void main(String args[]) throws ClientException {
  27. if (args.length < 2) {
  28. System.err.println("CreateTokenDemo need params: <AccessKey Id> <AccessKey Secret>");
  29. System.exit(-1);
  30. }
  31. String accessKeyId = args[0];
  32. String accessKeySecret = args[1];
  33. // 创建DefaultAcsClient实例并初始化
  34. DefaultProfile profile = DefaultProfile.getProfile(
  35. REGIONID,
  36. accessKeyId,
  37. accessKeySecret);
  38. IAcsClient client = new DefaultAcsClient(profile);
  39. CommonRequest request = new CommonRequest();
  40. request.setDomain(DOMAIN);
  41. request.setVersion(API_VERSION);
  42. request.setAction(REQUEST_ACTION);
  43. request.setMethod(MethodType.POST);
  44. request.setProtocol(ProtocolType.HTTPS);
  45. CommonResponse response = client.getCommonResponse(request);
  46. System.out.println(response.getData());
  47. if (response.getHttpStatus() == 200) {
  48. JSONObject result = JSON.parseObject(response.getData());
  49. String token = result.getJSONObject(KEY_TOKEN).getString(KEY_ID);
  50. long expireTime = result.getJSONObject(KEY_TOKEN).getLongValue(KEY_EXPIRETIME);
  51. System.out.println("获取到的Token: " + token + ",有效期时间戳(单位:秒): " + expireTime);
  52. // 将10位数的时间戳转换为北京时间
  53. String expireDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(expireTime * 1000));
  54. System.out.println("Token有效期的北京时间:" + expireDate);
  55. }
  56. else {
  57. System.out.println("获取Token失败!");
  58. }
  59. }
  60. }

调用示例(Python)

1.使用pip安装SDK

执行以下命令,通过pip安装Python SDK,版本为2.13.3:

  1. pip install aliyun-python-sdk-core==2.13.3 # 安装阿里云SDK核心库

说明:文档会定期更新最新可支持获取token的SDK版本,您已经安装使用的SDK版本可继续使用。

2.示例代码

  1. # -*- coding: utf8 -*-
  2. from aliyunsdkcore.client import AcsClient
  3. from aliyunsdkcore.request import CommonRequest
  4. # 创建AcsClient实例
  5. client = AcsClient(
  6. "<您的AccessKey Id>",
  7. "<您的AccessKey Secret>",
  8. "ap-southeast-1"
  9. );
  10. # 创建request,并设置参数
  11. request = CommonRequest()
  12. request.set_method('POST')
  13. request.set_domain('nlsmeta.ap-southeast-1.aliyuncs.com')
  14. request.set_version('2019-07-17')
  15. request.set_action_name('CreateToken')
  16. response = client.do_action_with_exception(request)
  17. print(response)

调用示例(GO)

示例代码:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/aliyun/alibaba-cloud-sdk-go/sdk"
  5. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  6. )
  7. func main() {
  8. client, err := sdk.NewClientWithAccessKey("ap-southeast-1", "<您的AccessKey Id>", "<您的AccessKey Secret>")
  9. if err != nil {
  10. panic(err)
  11. }
  12. request := requests.NewCommonRequest()
  13. request.Method = "POST"
  14. request.Domain = "nlsmeta.ap-southeast-1.aliyuncs.com"
  15. request.ApiName = "CreateToken"
  16. request.Version = "2019-07-17"
  17. response, err := client.ProcessCommonRequest(request)
  18. if err != nil {
  19. panic(err)
  20. }
  21. fmt.Print(response.GetHttpStatus())
  22. fmt.Print(response.GetHttpContentString())
  23. }

调用示例(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文件中,作为依赖模块。

  1. $ npm install @alicloud/pop-core --save

另外,也可以从GitHub下载SDK。

2.示例代码

  1. var RPCClient = require('@alicloud/pop-core').RPCClient;
  2. var client = new RPCClient({
  3. accessKeyId: '<您的AccessKey Id>',
  4. accessKeySecret: '<您的AccessKey Secret>',
  5. endpoint: 'http://nlsmeta.ap-southeast-1.aliyuncs.com',
  6. apiVersion: '2019-07-17'
  7. });
  8. // => returns Promise
  9. // => request(Action, params, options)
  10. client.request('CreateToken').then((result) => {
  11. console.log(result.Token);
  12. });

调用示例(.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.示例代码

  1. using System;
  2. using Aliyun.Acs.Core;
  3. using Aliyun.Acs.Core.Exceptions;
  4. using Aliyun.Acs.Core.Profile;
  5. class Sample
  6. {
  7. static void Main(string[] args)
  8. {
  9. // 构建一个客户端实例,用于发起请求
  10. IClientProfile profile = DefaultProfile.GetProfile(
  11. "ap-southeast-1",
  12. "<您的AccessKey Id>",
  13. "<您的AccessKey Secret>");
  14. DefaultAcsClient client = new DefaultAcsClient(profile);
  15. try
  16. {
  17. // 构造请求
  18. CommonRequest request = new CommonRequest();
  19. request.Domain = "nlsmeta.ap-southeast-1.aliyuncs.com";
  20. request.Version = "2019-07-17";
  21. // 因为是 RPC 风格接口,需指定 ApiName(Action)
  22. request.Action = "CreateToken";
  23. // 发起请求,并得到 Response
  24. CommonResponse response = client.GetCommonResponse(request);
  25. System.Console.WriteLine(response.Data);
  26. }
  27. catch (ServerException ex)
  28. {
  29. System.Console.WriteLine(ex.ToString());
  30. }
  31. catch (ClientException ex)
  32. {
  33. System.Console.WriteLine(ex.ToString());
  34. }
  35. }
  36. }