全部产品
云市场
云游戏

获取Token

更新时间:2020-09-23 15:03:31

访问令牌(Access Token)是调用智能语音交互服务的凭证。本文介绍获取访问令牌的方法。

前提条件

已获取AccessKey ID和AccessKey Secret,详情请参见开通服务

您可以使用阿里云公共SDK调用云端服务获取Access Token(调用时需提供阿里云账号的AccessKey IDAccessKey Secret)。除此之外,您可根据需求,自行完成获取Access Token的客户端请求,详情请参见获取Token协议说明

说明

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

操作步骤

  1. 登录智能语音交互管控台

  2. 默认进入总览,单击页面右上角点击获取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过程中,出现异常失败需排查问题,请参见错误代码表

说明
  1. 调用方最常见的一个错误描述是:Request was denied due to user flow control.,表示接口调用被限流,所以获取Token的请求不宜频繁,否则可能会被阿里云网关拒绝。

  2. Access Token获取之后可在有效期内多次使用(跨线程、跨进程、跨机器)。

移动端获取Token

推荐在服务端集成下方提供的SDK,获取访问令牌。

  1. 在服务端集成Java SDK,通过HTTP GET实现*/gettoken接口。

  2. 客户端访问*/gettoken接口获取Token A和有效时间。

  3. 使用Token A访问语音服务。每次调用语音服务之前都获取新的Token。

  4. 在本地缓存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及以上

    • Ccc4或Ccc5

  • Windows下:VS2013或VS2015

    Windows平台需要您自己搭建工程。

  1. 下载 C++ Token SDK

  2. 编译示例。

    假设示例文件已解压至path/to路径下,在Linux终端依次执行如下命令编译运行程序。

    支持Cmake:

    1. 确认本地系统已安装Cmake2.4及以上版本。

    2. cd path/to/sdk/lib

    3. tar -zxvpf linux.tar.gz

    4. cd path/to/sdk

    5. ./build.sh

    6. cd path/to/sdk/demo

    7. ./tokenDemo <yourAccessKeySecret> <yourAccessKeyId>

    不支持Cmake:

    1. cd path/to/sdk/lib

    2. tar -zxvpf linux.tar.gz

    3. cd path/to/sdk/demo

    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

    5. export LD_LIBRARY_PATH=path/to/sdk/lib/linux/

    6. ./tokenDemo <yourAccessKeySecret> <yourAccessKeyId>

  3. 调用服务。

    获取访问令牌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(推荐)。旧版获取Token的方法请参见基于阿里云aliyun-openapi-php-sdk 获取Token

安装前请确保环境使用的是PHP 5.5及以上版本,PHP SDK安装方式请参见安装Alibaba Cloud SDK for PHP

调用步骤:

  1. 创建一个全局客户端。

  2. 创建API请求,设置参数。

  3. 发起请求,处理应答或异常。

<?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("cn-shanghai")
            ->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

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库。

    <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 = "cn-shanghai";
        // 获取Token服务域名
        private static final String DOMAIN = "nls-meta.cn-shanghai.aliyuncs.com";
        // API版本
        private static final String API_VERSION = "2019-02-28";
        // 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核心库

  2. 调用服务。

    示例代码如下。

    # -*- coding: utf8 -*-
    
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.request import CommonRequest
    
    # 创建AcsClient实例
    client = AcsClient(
       "<您的AccessKey Id>",
       "<您的AccessKey Secret>",
       "cn-shanghai"
    );
    
    # 创建request,并设置参数。
    request = CommonRequest()
    request.set_method('POST')
    request.set_domain('nls-meta.cn-shanghai.aliyuncs.com')
    request.set_version('2019-02-28')
    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("cn-shanghai", "<yourAccessKey Id>", "<yourAccessKey Secret>")
    if err != nil {
        panic(err)
    }
    request := requests.NewCommonRequest()
    request.Method = "POST"
    request.Domain = "nls-meta.cn-shanghai.aliyuncs.com"
    request.ApiName = "CreateToken"
    request.Version = "2019-02-28"
    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,请参见GitHu下载SDK

  2. 调用服务。

    示例代码如下。

    var RPCClient = require('@alicloud/pop-core').RPCClient;
    
    var client = new RPCClient({
      accessKeyId: '<yourAccessKey Id>',
      accessKeySecret: '<yourAccessKey Secret>',
      endpoint: 'http://nls-meta.cn-shanghai.aliyuncs.com',
      apiVersion: '2019-02-28'
    });
    
    // => returns Promise
    // => request(Action, params, options)
    client.request('CreateToken').then((result) => {
        console.log(result.Token);
    });

调用示例(.NET)

  1. 安装.NET SDK。

    获取Token的.NET示例使用了阿里云.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(
                "cn-shanghai",
                "<yourAccessKey Id>",
                "<yourAccessKey Secret>");
            DefaultAcsClient client = new DefaultAcsClient(profile);
    
            try
            {
                // 构造请求
                CommonRequest request = new CommonRequest();
                request.Domain = "nls-meta.cn-shanghai.aliyuncs.com";
                request.Version = "2019-02-28";
    
                // 因为是RPC风格接口,需指定ApiName(Action)。
                request.Action = "CreateToken";
    
                // 发起请求,并得到响应。
                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());
            }
        }
    }