SDK內封裝了獲取和刷新Token的過程,使用戶無需手動處理復雜的認證邏輯和Token有效期管理,簡化了開發流程,提升了開發效率,更加安全有效。本文介紹如何通過SDK方式獲取Token。
背景信息
通過SDK獲取Token方式 | 說明 |
通過智能語音交互SDK獲取Token | 適用于通過智能語音交互SDK直接獲取Token的場景, 建議您集成此SDK。 |
通過阿里云公共SDK獲取Token | 適用于當前智能語音交互暫未提供對應語言SDK獲取Token的場景。 |
前提條件
已獲取AccessKey ID和AccessKey Secret,具體操作,請參見從這里開始。
調用接口前,需配置環境變量,通過環境變量讀取訪問憑證。智能語音交互的AccessKey ID和AccessKey Secret的環境變量名:ALIYUN_AK_ID和ALIYUN_AK_SECRET。
通過智能語音交互SDK獲取Token
調用示例(Java)
從Maven服務器下載最新版本SDK,下載demo源碼ZIP包。
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-common</artifactId>
<version>2.1.6</version>
</dependency>
Java代碼獲取訪問令牌Token實現示例如下:
AccessToken accessToken = new AccessToken(System.getenv().get("ALIYUN_AK_ID"), System.getenv().get("ALIYUN_AK_SECRET"));
accessToken.apply();
String token = accessToken.getToken();
long expireTime = accessToken.getExpireTime();
token
為服務端分配的Token,在Token過期失效前,可以一直使用,也支持在不同機器、進程或應用上同時使用該Token。expireTime
為此令牌的有效期時間戳,單位:秒。例如,1527592757換算為北京時間為2018/5/29 19:19:17,即Token在該時間之前有效,過期需要重新獲取。
當前獲取Token需要獲取AccessKey ID和AccessKey Secret,為了安全起見,一般不建議在端側操作,比如在移動端等環境下保存AccessKey ID和AccessKey Secret,建議您在安全可靠的環境中使用AccessKey ID和AccessKey Secret。
如果您的使用場景是移動端APP,可以考慮自行在服務端搭建一個Token生成器的服務,將AccessKey ID和AccessKey Secret放在服務端,APP調用語音識別前,先向您的服務端請求下發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>
。
調用服務。
C++獲取訪問令牌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(getenv("ALIYUN_AK_SECRET")); /*設置阿里云賬號KeyId*/ nlsTokenRequest.setAccessKeyId(getenv("ALIYUN_AK_ID")); /*獲取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; } }
通過阿里云公共SDK獲取Token
使用阿里云公共SDK獲取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的版本號,固定值。 |
通過阿里云SDK獲取Token時,如果成功調用,則會返回如下報文:
Id
為本次分配的訪問令牌Token,在Token過期失效前,可以一直使用,也支持在不同機器、進程或應用上同時使用該Token。ExpireTime
為此令牌的有效期時間戳,單位:秒。如,1527592757換算為北京時間為2018/5/29 19:19:17,即Token在該時間之前有效,過期需要重新獲取。
調用示例(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 = "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 { String accessKeyId = System.getenv().get("ALIYUN_AK_ID"); String accessKeySecret = System.getenv().get("ALIYUN_AK_SECRET"); // 創建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.15.1。
pip install aliyun-python-sdk-core==2.15.1 # 安裝阿里云SDK核心庫
調用服務。
示例代碼如下:
#! /usr/bin/env python # coding=utf-8 import os import time import json from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest # 創建AcsClient實例 client = AcsClient( os.getenv('ALIYUN_AK_ID'), os.getenv('ALIYUN_AK_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') try : response = client.do_action_with_exception(request) print(response) jss = json.loads(response) if 'Token' in jss and 'Id' in jss['Token']: token = jss['Token']['Id'] expireTime = jss['Token']['ExpireTime'] print("token = " + token) print("expireTime = " + str(expireTime)) except Exception as e: print(e)
調用示例(GO)
開發前請先安裝alibaba-cloud-sdk-go,具體操作請參見安裝操作。
示例代碼如下:
package main
import (
"fmt"
"encoding/json"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)
type TokenResult struct {
ErrMsg string
Token struct {
UserId string
Id string
ExpireTime int64
}
}
func main() {
client, err := sdk.NewClientWithAccessKey("cn-shanghai",os.Getenv("ALIYUN_AK_ID"),os.Getenv("ALIYUN_AK_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())
var tr TokenResult
err = json.Unmarshal([]byte(response.GetHttpContentString()), &tr)
if err == nil {
fmt.Println(tr.Token.Id)
fmt.Println(tr.Token.ExpireTime)
} else {
fmt.Println(err)
}
}
調用示例(PHP)
安裝前請確保環境使用的是PHP 7.2及以上版本,PHP SDK安裝方式請參見安裝Alibaba Cloud SDK for PHP 。
創建一個全局客戶端。
創建API請求,設置參數。
發起請求,處理應答或異常。
PHP代碼獲取訪問令牌Token代碼示例如下:
<?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(
getenv('ALIYUN_AK_ID'),
getenv('ALIYUN_AK_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);
print "獲取到的token是:" . $token["Id"] ."\n";
date_default_timezone_set('Asia/Shanghai');
print "獲取到的token過期時間是:" . $token["ExpireTime"] . "\n";
}
else {
print "token 獲取失敗\n";
}
} catch (ClientException $exception) {
// 獲取錯誤消息
print_r($exception->getErrorMessage());
} catch (ServerException $exception) {
// 獲取錯誤消息
print_r($exception->getErrorMessage());
}
上述示例代碼是基于阿里云新版PHP SDK進行示例,請參見Alibaba Cloud SDK for PHP。如果您已接入阿里云舊版PHP SDK,參見aliyun-openapi-php-sdk,仍然可以繼續使用或者更新到新版SDK。
調用示例(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: process.env.ALIYUN_AK_ID, accessKeySecret: process.env.ALIYUN_AK_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) console.log("token = " + result.Token.Id) console.log("expireTime = " + result.Token.ExpireTime) });
常見問題
在獲取Token過程中,可能會出現各種異常問題,整體的排查思路如下:
您可以根據錯誤碼以及錯誤信息在阿里云官方的錯誤代碼表中找到對應錯誤含義及解決方案。例如,使用一個不存在的AccessKeyId調用服務獲取Token時,可能返回如下結果:
{ "RequestId":"F5805076-38C5-5093-B5BD-9176ECD9CBBD", "Message":"Specified access key is not found.", "Recommend":"https://next.api.aliyun.com/troubleshoot?q=InvalidAccessKeyId.NotFound&product=nls-cloud-meta", "HostId":"nls-meta.cn-shanghai.aliyuncs.com", "Code":"InvalidAccessKeyId.NotFound" }
在錯誤代碼表搜索該段代碼中錯誤信息的關鍵字,例如,InvalidAccessKeyId.NotFound和Specified access key is not found,可以獲取相關錯誤碼詳情。
您也可以在阿里云OpenAPI診斷中心頁面輸入錯誤信息,查找解決方案。
相關文檔
除了SDK方式獲取Token,您還可以通過以下方式獲取Token: