サーバー上でトークンを取得することで、長期的な AccessKey 認証情報をモバイルアプリケーションから分離します。SDK がリクエストに署名します。アプリケーションはトークンを保存し、その有効期限を確認して、有効期限が切れる前に代替のトークンを取得する必要があります。
背景情報
プロジェクトで使用する SDK に合わせて方法を選択します。2 つの SDK のうち、どちらか 1 つだけが必要です。
|
方法 |
使用するケース |
|
NLS SDK |
対応する SDK がすでに統合されている場合は、トークンリクエストクラスを使用します。 |
|
Alibaba Cloud 共通 SDK |
共通 SDK を使用して |
認証情報の設定
Intelligent Speech Interaction が有効化されたアカウントと、必要な権限を持つ AccessKey ペアが必要です。サービスの有効化と認証情報の設定については、「クイックスタート」をご参照ください。
トークンリクエストでは、Model Studio API キーではなく AccessKey ペアを使用します。サンプルを実行するプロセスの環境に認証情報を設定します。AccessKey ID には ALIYUN_AK_ID を、AccessKey シークレットには ALIYUN_AK_SECRET を設定します。
AccessKey 認証情報は、ソースコードやモバイルアプリケーション内ではなく、信頼できるサーバー環境に保管してください。モバイルアプリケーションは、音声サービスを呼び出す前に、アプリケーションサーバーにトークンをリクエストします。サンプルでは、トークン自体ではなく、結果と有効期限のみが出力されます。AccessKey 認証情報、トークン、または完全な署名付きリクエストをログに記録しないでください。
NLS SDK を使用したトークンの取得
Java
Maven の依存関係を追加します。このサンプルでは nls-sdk-common 2.1.6 を使用します。JDK 21 でサンプルを実行するには、JAXB API も必要です。
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-common</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
apply() を呼び出してリクエストを送信します。次に、getToken() と getExpireTime() を呼び出して、トークンと有効期限を取得します。このリクエストクラスは、スケジュールに従ってトークンを自動的に更新しません。
import com.alibaba.nls.client.AccessToken;
public class NlsTokenDemo {
public static void main(String[] args) throws Exception {
AccessToken request = new AccessToken(
System.getenv("ALIYUN_AK_ID"),
System.getenv("ALIYUN_AK_SECRET"),
"nlsmeta.ap-southeast-1.aliyuncs.com",
"ap-southeast-1", "2019-07-17");
request.apply();
String token = request.getToken();
long expireTime = request.getExpireTime();
System.out.println("Token acquired: " + (token != null && !token.isEmpty()));
System.out.println("ExpireTime (Unix seconds): " + expireTime);
}
}
Alibaba Cloud 共通 SDK を使用したトークンの取得
共通 SDK を使用する RPC リクエストでは、次のパラメーターを使用します。エンドポイント、リージョン、API バージョンは記載されているとおりに組み合わせて使用し、いずれか 1 つだけを変更しないでください。
|
パラメーター |
設定 |
説明 |
|
|
|
トークンサービスのエンドポイント。 |
|
|
|
リクエストのリージョン。 |
|
|
|
API 操作。 |
|
|
|
RPC API のバージョン。 |
Java
Maven の依存関係を追加します。このサンプルでは aliyun-java-sdk-core 3.7.1 と fastjson 1.2.83 を使用します。JDK 21 では JAXB API 2.3.1 も必要です。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</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.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
public class CreateTokenDemo {
public static void main(String[] args) throws Exception {
DefaultProfile profile = DefaultProfile.getProfile(
"ap-southeast-1", System.getenv("ALIYUN_AK_ID"),
System.getenv("ALIYUN_AK_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setDomain("nlsmeta.ap-southeast-1.aliyuncs.com");
request.setVersion("2019-07-17");
request.setAction("CreateToken");
request.setMethod(MethodType.POST);
request.setProtocol(ProtocolType.HTTPS);
CommonResponse response = client.getCommonResponse(request);
JSONObject result = JSON.parseObject(response.getData()).getJSONObject("Token");
String token = result.getString("Id");
long expireTime = result.getLongValue("ExpireTime");
System.out.println("Token acquired: " + (token != null && !token.isEmpty()));
System.out.println("ExpireTime (Unix seconds): " + expireTime);
}
}
Python
依存関係をインストールします。このサンプルでは aliyun-python-sdk-core 2.15.1 を使用します。
pip install aliyun-python-sdk-core
import json
import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
client = AcsClient(
os.environ["ALIYUN_AK_ID"],
os.environ["ALIYUN_AK_SECRET"],
"ap-southeast-1",
)
request = CommonRequest()
request.set_method("POST")
request.set_protocol_type("https")
request.set_domain("nlsmeta.ap-southeast-1.aliyuncs.com")
request.set_version("2019-07-17")
request.set_action_name("CreateToken")
result = json.loads(client.do_action_with_exception(request))
token = result["Token"]["Id"]
expire_time = result["Token"]["ExpireTime"]
print("Token acquired:", bool(token))
print("ExpireTime (Unix seconds):", expire_time)
Go
Go モジュールに依存関係をインストールします。このサンプルでは alibaba-cloud-sdk-go 1.63.107 を使用します。
go get github.com/aliyun/alibaba-cloud-sdk-go/sdk
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
)
func main() {
credential := credentials.NewAccessKeyCredential(
os.Getenv("ALIYUN_AK_ID"), os.Getenv("ALIYUN_AK_SECRET"))
client, err := sdk.NewClientWithOptions("ap-southeast-1", sdk.NewConfig(), credential)
if err != nil {
panic(err)
}
request := requests.NewCommonRequest()
request.Scheme = "HTTPS"
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)
}
var result struct {
Token struct {
Id string
ExpireTime int64
}
}
if err := json.Unmarshal(response.GetHttpContentBytes(), &result); err != nil {
panic(err)
}
token := result.Token.Id
fmt.Println("Token acquired:", token != "")
fmt.Println("ExpireTime (Unix seconds):", result.Token.ExpireTime)
}
PHP
PHP 7.2 以降を使用し、Composer で依存関係をインストールします。このサンプルでは alibabacloud/sdk 1.8.2345 と alibabacloud/client 1.5.32 を使用します。
composer require alibabacloud/sdk
このサンプルでは、共通の RPC リクエストを使用し、エンドポイント、API バージョン、HTTP メソッドを明示的に設定します。
<?php
require __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
AlibabaCloud::accessKeyClient(
getenv('ALIYUN_AK_ID'), getenv('ALIYUN_AK_SECRET'))
->regionId('ap-southeast-1')
->asDefaultClient();
$response = AlibabaCloud::rpc()
->product('nls-cloud-meta')
->version('2019-07-17')
->action('CreateToken')
->host('nlsmeta.ap-southeast-1.aliyuncs.com')
->scheme('https')
->method('POST')
->request();
$token = $response['Token']['Id'];
$expireTime = $response['Token']['ExpireTime'];
echo 'Token acquired: ' . (!empty($token) ? 'true' : 'false') . PHP_EOL;
echo 'ExpireTime (Unix seconds): ' . $expireTime . PHP_EOL;
Node.js
依存関係をインストールします。このサンプルでは @alicloud/pop-core 1.8.0 を使用します。
npm install @alicloud/pop-core
const { RPCClient } = require('@alicloud/pop-core');
const client = new RPCClient({
accessKeyId: process.env.ALIYUN_AK_ID,
accessKeySecret: process.env.ALIYUN_AK_SECRET,
endpoint: 'https://nlsmeta.ap-southeast-1.aliyuncs.com',
apiVersion: '2019-07-17',
});
async function main() {
const result = await client.request('CreateToken', {}, { method: 'POST' });
const token = result.Token.Id;
const expireTime = result.Token.ExpireTime;
console.log('Token acquired:', Boolean(token));
console.log('ExpireTime (Unix seconds):', expireTime);
}
main().catch((error) => {
console.error('CreateToken failed:', error.code || error.name);
process.exitCode = 1;
});
レスポンスと使用上の注意
共通 SDK リクエストが成功したら、レスポンスの Token オブジェクトから次のフィールドを読み取ります。Java 用 NLS SDK は、対応するメソッドを通じてこれらの値を返します。
|
フィールド |
タイプ |
説明 |
|
|
String |
後続の音声サービスリクエスト用のトークン文字列です。Java 用 NLS SDK では、 |
|
|
Long |
有効期限 (秒単位の UNIX タイムスタンプ)。Java 用 NLS SDK では、 |
-
すべての音声サービスリクエストの前にトークンを取得するのではなく、有効期間中はトークンをキャッシュして再利用してください。返された
ExpireTime値を使用して、トークンの有効期限を判断します。有効期限が切れる前に代替のトークンを取得し、キャッシュを更新してください。返された値の代わりに固定期間を使用しないでください。 -
信頼できる環境内の複数のプロセスまたはアプリケーションで、同じトークンを使用できます。これらのサンプルで設定されているエンドポイントからトークンを取得してください。上海とシンガポールのエンドポイントによって発行されたトークンを交換して使用しないでください。
-
音声サービスには、完全な JSON レスポンス、AccessKey 認証情報、またはその他のフィールドではなく、
Id文字列を渡してください。音声 API の認証プロトコルで要求される場所にトークンを渡してください。
よくある質問
トークンリクエストの失敗をトラブルシューティングするにはどうすればよいですか?
SDK から返されたエラーコードを使用して原因を特定します。認証エラーの原因は、不正な AccessKey ペアだけではありません。
|
エラーコード |
トラブルシューティング |
|
|
AccessKey ID が正しいこと、目的の ID のものであること、そしてコピー時にスペースが含まれていないことを確認してください。 |
|
|
AccessKey ID と AccessKey シークレットが一致するペアであること、および署名されたパラメーターが変更されていないことを確認してください。手動で署名を組み立てる代わりに、共通 SDK を使用してリクエストを構築することを推奨します。 |
|
|
リクエスト元のシステムのクロックが標準時と同期していることを確認してください。このエラーは、発行されたトークンの有効期限ではなく、リクエストのタイムスタンプに関するものです。 |
|
|
エンドポイントと API バージョンを確認し、RPC リクエストと ROA リクエストを区別してください。PHP のリクエストスタイルは、その API バージョンと一致している必要があります。 |
音声 API が無効なトークンを報告した場合はどうすればよいですか?
40000001 は、音声サービス呼び出し時の認証エラーを示します。実際のトークン文字列と必要なすべての認証パラメーターが提供されていること、トークンの有効期限が切れていないこと、およびトークンを発行したエンドポイントがサービス設定と一致していることを確認してください。同じエラーコードでも原因は複数考えられるため、完全なエラーメッセージを確認してください。
"Not supported proxy scheme" エラーを解決するにはどうすればよいですか?
http_proxy、https_proxy、およびアプリケーションで設定されているプロキシを確認してください。SDK でサポートされているプロキシプロトコルを使用し、プロキシのアドレス、ポート、可用性を確認してください。ネットワークでプロキシが不要な場合は、プロキシ設定を削除して再試行してください。
関連トピック
-
一時的なテストのためにコンソールからトークンを取得するには、「コンソールでのトークンの取得」をご参照ください。
-
署名付きリクエストを直接構築するには、「OpenAPI を使用したトークンの取得」をご参照ください。