全部产品
云市场

获取 Token

更新时间:2019-10-31 14:50:53

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 并更新本地缓存。

通过SDK获取

调用示例(Java)

调用代码如下:

  1. AccessToken token = new AccessToken("your akID", "your akSecret");
  2. token.apply();
  3. String accessToken = token.getToken();
  4. long expireTime = token.getExpireTime();

注意:文档提供的java 代码是用在服务端的,Android 使用需要在服务端/pc上运行获取token,建议您搭建服务端,客户端请求服务端更新token,这样才能保证安全。

调用示例(C++)

1.下载TokenSdkToken下载链接(demo说明可阅读readme.txt文件):C++ TokenSdk

2.编译Demo

  1. 1. 请确认本地系统已安装Cmake,最低版本2.4
  2. 2. cd path/to/sdk/lib
  3. 3. tar -zxvpf linux.tar.gz
  4. 4. cd path/to/sdk
  5. 5. 执行[./build.sh]编译demo
  6. 6. 编译完毕,进入demo目录,执行
  7. ./tokenDemo your-AccessKeySecret your-AccessKeyId
  8. 如果不支持cmake,可以尝试手动编译:
  9. 1: cd path/to/sdk/lib
  10. 2: tar -zxvpf linux.tar.gz
  11. 3: cd path/to/sdk/demo
  12. 4: 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
  13. 5: export LD_LIBRARY_PATH=path/to/sdk/lib/linux/
  14. 6: ./tokenDemo your-AccessKeySecret your-AccessKeyId
  15. Windows平台需要您自己搭建工程。

注意:

  • linux环境下,运行环境最低要求:Glibc 2.5及以上, Gcc4、Gcc5。
  • Windows下,目前支持VS2013、VS2015。

3.调用服务

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

  1. #include <iostream>
  2. #include "Token.h"
  3. using std::cout;
  4. using std::endl;
  5. using namespace AlibabaNlsCommon;
  6. //获取访问令牌TokenId
  7. int getTokenId(const char* keySecret, const char* keyId) {
  8. NlsToken nlsTokenRequest;
  9. /*设置阿里云账号KeySecret*/
  10. nlsTokenRequest.setKeySecret(keySecret);
  11. /*设置阿里云账号KeyId*/
  12. nlsTokenRequest.setAccessKeyId(keyId);
  13. /*获取token. 成功返回0, 失败返回-1*/
  14. if (-1 == nlsTokenRequest.applyNlsToken()) {
  15. cout << "Failed: " << nlsTokenRequest.getErrorMsg() << endl; /*获取失败原因*/
  16. return -1;
  17. } else {
  18. cout << "TokenId: " << nlsTokenRequest.getToken() << endl; /*获取TokenId*/
  19. cout << "TokenId expireTime: " << nlsTokenRequest.getExpireTime() << endl; /*获取Token有效期时间戳(秒)*/
  20. return 0;
  21. }
  22. }

调用示例(PHP)

说明:如下使用是阿里云新版PHP SDK(Alibaba Cloud SDK for PHP),新用户可直接使用。如果您已经接入阿里云旧版PHP SDK(aliyun-openapi-php-sdk),可选择继续使用旧版SDK,或者更新到新版SDK(推荐)。旧版获取Token的PHP Demo链接 https://help.aliyun.com/document_detail/104327.html

安装阿里云 PHP SDK

PHP版本要求:PHP >= 5.5

1.下载并安装Composer

请阅读PHP SDK最新安装方式,打开链接

  • Linux:
    1. curl -sS https://getcomposer.org/installer | php
  • windows:下载并安装Composer,请单击这里

2.执行Composer命令安装Alibaba Cloud SDK for PHP的最新版本

在Demo文件所在目录下执行以下命令,会生成一个composer.json文件和vendor目录:

  1. php -d memory_limit=-1 composer.phar require alibabacloud/sdk
  2. php -d memory_limit=-1 composer.phar dump-autoload --optimize

注意: composer.phar如果不在当前目录,应改为绝对路径。

3.在代码中引入Composer自动加载工具

  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';

注意: 如上设置Demo文件应与vendor同一个目录,否则需要替换为autoload.php所在的路径,如require '/path/to/vendor/autoload.php';

调用步骤:

  1. 创建一个全局客户端,鉴权使用了阿里云账号的AccessKey ID和AccessKey Secret(获取方法请阅读 开通服务一节)。
  2. 创建API请求并设置参数。
  3. 发起请求并处理应答或异常。
  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. use AlibabaCloud\Client\AlibabaCloud;
  4. use AlibabaCloud\Client\Exception\ClientException;
  5. use AlibabaCloud\Client\Exception\ServerException;
  6. /**
  7. * 第一步:设置一个全局客户端
  8. * 使用阿里云RAM账号的AccessKey ID和AccessKey Secret进行鉴权
  9. */
  10. AlibabaCloud::accessKeyClient(
  11. "<your-access-key-id>",
  12. "<your-access-key-secret>")
  13. ->regionId("cn-shanghai")
  14. ->asDefaultClient();
  15. try {
  16. $response = AlibabaCloud::nlsCloudMeta()
  17. ->v20180518()
  18. ->createToken()
  19. ->request();
  20. print $response . "\n";
  21. $token = $response["Token"];
  22. if ($token != NULL) {
  23. print "Token 获取成功:\n";
  24. print_r($token);
  25. }
  26. else {
  27. print "token 获取失败\n";
  28. }
  29. } catch (ClientException $exception) {
  30. // 获取错误消息
  31. print_r($exception->getErrorMessage());
  32. } catch (ServerException $exception) {
  33. // 获取错误消息
  34. print_r($exception->getErrorMessage());
  35. }

通过CommonRequest获取

使用阿里云公共SDK获取Access token,建议采用RPC风格的API调用。发起一次RPC风格的CommonAPI请求,您需要提供以下几个参数:

参数名 参数值 说明
domain nls-meta.cn-shanghai.aliyuncs.com 即该产品的通用访问域名,固定值
region_id cn-shanghai 服务的地域ID,固定值
action CreateToken 该API的名称,固定值
version 2019-02-28 该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 = "cn-shanghai";
  16. // 获取Token服务域名
  17. private static final String DOMAIN = "nls-meta.cn-shanghai.aliyuncs.com";
  18. // API 版本
  19. private static final String API_VERSION = "2019-02-28";
  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. "cn-shanghai"
  9. );
  10. # 创建request,并设置参数
  11. request = CommonRequest()
  12. request.set_method('POST')
  13. request.set_domain('nls-meta.cn-shanghai.aliyuncs.com')
  14. request.set_version('2019-02-28')
  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("cn-shanghai", "<您的AccessKey Id>", "<您的AccessKey Secret>")
  9. if err != nil {
  10. panic(err)
  11. }
  12. request := requests.NewCommonRequest()
  13. request.Method = "POST"
  14. request.Domain = "nls-meta.cn-shanghai.aliyuncs.com"
  15. request.ApiName = "CreateToken"
  16. request.Version = "2019-02-28"
  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://nls-meta.cn-shanghai.aliyuncs.com',
  6. apiVersion: '2019-02-28'
  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. "cn-shanghai",
  12. "<您的AccessKey Id>",
  13. "<您的AccessKey Secret>");
  14. DefaultAcsClient client = new DefaultAcsClient(profile);
  15. try
  16. {
  17. // 构造请求
  18. CommonRequest request = new CommonRequest();
  19. request.Domain = "nls-meta.cn-shanghai.aliyuncs.com";
  20. request.Version = "2019-02-28";
  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. }