すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo Live:トークンベースの認証

最終更新日:Sep 09, 2024

このトピックでは、ApsaraVideo Real-time Communication (ARTC) シナリオでトークンを生成するためのルールについて説明します。

前提条件

  • Alibaba Cloudアカウントが作成され、ApsaraVideo Liveが有効化されています。

  • ARTCアプリケーションは、ApsaraVideo Liveコンソールで作成されます。 詳細については、「ARTCアプリケーションの作成」をご参照ください。

  • AppIDとAppKeyが取得されます。 詳細については、「AppKeyの照会」をご参照ください。

背景情報

トークンは、署名形式のセキュリティ資格情報であり、IDを認証し、クラウドサービスを悪意のある当事者から保護するために使用されます。 SDKのjoinChannel関数を呼び出すときは、AppIDUserIDChannelIDNonceTimestamp、およびTokenパラメーターを指定する必要があります。 AppIDはアプリケーションのIDを指定し、UserIDはユーザーIDを指定します。 トークンは、AppIDAppKeyChannelIDNonceUserID、およびTimestampの組み合わせから生成されます。 このメカニズムにより、悪意のある者がトークンを偽造してクラウドサービスにアクセスできなくなります。

Alibaba Cloudは、統合を容易にするために、ARTCおよびコストリーミングシナリオ用のさまざまなAPIを提供しています。

トークン生成方法

次の方法を使用して、サーバー側でトークンを生成できます。

// 1. Concatenate the values of AppID, AppKey, ChannelID, UserID, Nonce, and Timestamp to form a string.
// 2. Hash the string by using SHA-256. The output is your token.
// 3. The following sample code provides an example on how to verify the hash algorithm:
// AppID="abc",AppKey="abckey",ChannelID="abcChannel",UserID="abcUser",Nonce="",timestamp=1699423634
// token = sha256("abcabckeyabcChannelabcUser1699423634") = "3c9ee8d9f8734f0b7560ed8022a0590659113955819724fc9345ab8eedf84f31"
// 4. Note: We recommend that you set Nonce to an empty string and set Timestamp to the current Unix timestamp incremented by 86,400 seconds (equivalent to 24 hours).
token = sha256(AppID+AppKey+ChannelId+UserID+Nonce+timestamp)

次の表に、トークンの生成に使用されるパラメーターを示します。

パラメーター

説明

AppID

ARTCアプリケーションのID。 IDは、ApsaraVideo LiveコンソールでARTCアプリケーションを作成すると自動的に生成されます。 詳細については、「ARTCアプリケーションの作成」をご参照ください。

AppKey

ARTCアプリケーションの資格情報。 詳細については、「AppKeyの照会」をご参照ください。

channelID

チャネル ID 長さは最大64文字で、数字、文字、ハイフン (-) 、およびアンダースコア (_) を使用できます。 ストリーマとコーストリーマは同じチャネルIDを使用する必要があります。

userId

ユーザー ID。 長さは最大64文字で、数字、文字、ハイフン (-) 、およびアンダースコア (_) を使用できます。

ナンス

このパラメーターを空の文字列に設定することを推奨します。

timestamp

トークンの有効期限を指定するタイムスタンプ。 タイムスタンプは、ライブストリーミングの開始から24時間を超えることはできません。 ライブストリーミングの開始時間に24時間を追加する値にタイムスタンプを設定することを推奨します。

トークンが生成された後、サーバーは次のいずれかの方法を使用して、ビジネス要件に基づいてさらに操作できます。

  • 方法1 (マルチパラメーター入力): サーバーは、トークンとその5つの入力パラメーター (AppIDChannelIDNonceUserIDTimestamp) をJSON構造体でクライアント側に送信します。 その後、クライアントはこれらのパラメータをARTC SDKに転送し、ローカルに保存します。 Alibaba Cloudからテクニカルサポートをリクエストする場合は、すべてのパラメーターを指定する必要があります。

  • 方法2 (単一パラメーター入力): サーバーは、トークンとその5つの入力パラメーター (AppIDChannelIDNonceUserIDTimestamp) をJSON文字列に変換し、Base64で文字列をエンコードし、エンコードした文字列をクライアントアプリケーションに送信します。 その後、クライアントは、トラブルシューティングの目的で使用されるUserNameパラメーターとともに、Base64-encoded文字列をARTC SDKに渡します。

  • 方法3: サーバーは、トークンとその5つの入力パラメーター (AppIDChannelIDNonceUserID、およびTimestamp) を使用して、コストリーミング用のURLを構築し、それをコストリーミングSDKに渡します。

image

ビジネスシナリオ

ARTC

ARTCシナリオでは、単一パラメーターメソッドと複数パラメーターメソッドのどちらかを選択できます。 単一パラメーターメソッドは、サーバーとクライアント間のパラメーターの不一致による接続障害を防ぐのに役立つ構文解析として機能します。 使いやすくするために、ARTCシナリオでは単一パラメーターの方法を使用することをお勧めします。

単一パラメータ入力

単一パラメーターメソッドを使用すると、サーバーはBase64-encoded文字列をクライアントに渡します。 Base64-encoded文字列を生成するには、トークン、5つの入力パラメーター、およびgslbパラメーターを使用してJSONオブジェクトを作成し、Base64でJSONオブジェクトをエンコードします。 この方法では、アプリサーバーとクライアントアプリケーションが単一のパラメーターを使用して通信できるようになり、データの不整合による接続障害のリスクが最小限に抑えられます。

Alibaba Cloudからテクニカルサポートをリクエストする場合は、Base64-encoded文字列またはUserNameパラメーターを指定する必要があります。

サーバー側のサンプルコード

Javaサンプルコードを表示する

/**
 * Generate a token by using the appid, appkey, channelId, userId, nonce, and timestamp parameters.
 *
 * @param appid     The application ID. You can view the ID on the details page of your application in the ApsaraVideo Live console. 
 * @param appkey    The AppKey. You can view the key on the details page of your application in the ApsaraVideo Live console. 
 * @param channelId The channel ID.
 * @param userId    The user ID.
 * @return token
 */
public static String createBase64Token(String appid, String appkey, String channelId, String userId) {
    /* Set the timestamp to no greater than 24 hours from the current time. */
    long timestamp = Calendar.getInstance().add(Calendar.HOUR_OF_DAY, 24).getTimeInMillis() / 1000;
    String stringBuilder = appid +
            appkey +
            channelId +
            userId +
            timestamp;
    String token = getSHA256(stringBuilder);
    JSONObject tokenJson = new JSONObject();
    tokenJson.put("appid", appid);
    tokenJson.put("channelid", channelId);
    tokenJson.put("userid", userId);
    tokenJson.put("nonce", "");
    tokenJson.put("timestamp", timestamp);
    tokenJson.put("gslb",new String[]{"https://gw.rtn.aliyuncs.com"});
    tokenJson.put("token", token);
    String base64Token = Base64.encodeToString(JSON.toJSONBytes(tokenJson),Base64.NO_WRAP);
	return base64Token;
}

/**
 * Obtain a signature.
 *
 * @param str The Base64-encoded string.
 * @return The signature that is returned.
 */
public static String getSHA256(String str) {
    MessageDigest messageDigest;
    String encodestr = "";
    try {
        messageDigest = MessageDigest.getInstance("SHA-256");
        messageDigest.update(str.getBytes("UTF-8"));
        encodestr = byte2Hex(messageDigest.digest());
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return encodestr;
}

private static String byte2Hex(byte[] bytes) {
    StringBuilder stringBuffer = new StringBuilder();
    String temp = null;
    for (byte aByte : bytes) {
        temp = Integer.toHexString(aByte & 0xFF);
        if (temp.length() == 1) {
            stringBuffer.append("0");
        }
        stringBuffer.append(temp);
    }
    return stringBuffer.toString();
}

Pythonサンプルコードを表示する

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import hashlib
import datetime
import time
import base64
import json

def create_token(app_id, app_key, channel_id, user_id, timestamp):
    h = hashlib.sha256()
    h.update(str(app_id))
    h.update(str(app_key))
    h.update(str(channel_id))
    h.update(str(user_id))
    h.update(str(timestamp))
    token = h.hexdigest()
    return token

def main():
    app_id = 'xxxxxx'
    app_key = 'xxxxxxxx'
    channel_id = 'abcChannel'
    user_id = 'abcUser1'
    expire = datetime.datetime.now() + datetime.timedelta(days=1)
    timestamp = int(time.mktime(expire.timetuple()))
    # timestamp = 1699423634
    token = create_token(app_id, app_key, channel_id, user_id, timestamp)
    print(token)
    jsonToken = {'appid':app_id,
                 'channelid':channel_id,
                 'userid':user_id,
                 'nonce':'',
                 'timestamp':timestamp,
                 'gslb':['https://gw.rtn.aliyuncs.com'],
                 'token':token
                }
    # String base64Token = Base64.encodeToString(JSON.toJSONBytes(tokenJson),Base64.NO_WRAP);
    print(json.dumps(jsonToken))
    base64Token = base64.b64encode(json.dumps(jsonToken).encode())
    print(base64Token)

if __name__ == '__main__':
    main()

クライアント側のサンプルコード

  • Android用のJavaサンプルコード:

    // Set channelId and userId to null. If you assign other values to channelId and userId, make sure that these values match the values used to generate the token. You can implement a parameter consistency check between the server and client for verification.
    // base64Token is the Base64-encoded string.
    // username is an identifier used for troubleshooting purposes.
    mAliRtcEngine.joinChannel(base64Token, null, null, "username");
  • iOSのObjective-Cサンプルコード:

    // Set channelId and userId to null. If you assign other values to channelId and userId, make sure that these values match the values used to generate the token. You can implement a parameter consistency check between the server and client for verification.
    // base64Token is the Base64-encoded string.
    // username is an identifier used for troubleshooting purposes.
    [self.engine joinChannel:base64Token channelId:nil userId:nil name:@"username" onResultWithUserId:nil];

マルチパラメータ入力

マルチパラメーターメソッドを使用する場合、サーバーはトークンとその入力パラメーターをクライアントに送信します。 クライアントはこれらのパラメーターをAUTHINFO構造体に解析し、ARTC SDKを呼び出します。

Alibaba Cloudからテクニカルサポートをリクエストする場合は、AUTHINFO構造体またはUserNameパラメーターを指定する必要があります。

サーバー側のサンプルコード

Javaサンプルコードを表示する

/**
 * Generate a token based on the appid, appkey, channelId, userId, nonce, and timestamp parameters.
 *
 * @param appid     The application ID. You can view the ID on the details page of your application in the ApsaraVideo Live console. 
 * @param appkey    The AppKey. You can view the key on the details page of your application in the ApsaraVideo Live console. 
 * @param channelId The channel ID.
 * @param userId    The user ID.
 * @param timestamp The expiration timestamp.
 * @return token
 */
public static String createToken(String appid, String appkey, String channelId, String userId) {
    /* Set the timestamp to no greater than 24 hours from the current time. */
    long timestamp = Calendar.getInstance().add(Calendar.HOUR_OF_DAY, 24).getTimeInMillis() / 1000;
    String stringBuilder = appid +
            appkey +
            channelId +
            userId +
            timestamp;
    return getSHA256(stringBuilder);
}

/**
 * Obtain a signature.
 *
 * @param str The Base64-encoded string.
 * @return The signature that is returned.
 */
public static String getSHA256(String str) {
    MessageDigest messageDigest;
    String encodestr = "";
    try {
        messageDigest = MessageDigest.getInstance("SHA-256");
        messageDigest.update(str.getBytes("UTF-8"));
        encodestr = byte2Hex(messageDigest.digest());
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return encodestr;
}

private static String byte2Hex(byte[] bytes) {
    StringBuilder stringBuffer = new StringBuilder();
    String temp = null;
    for (byte aByte : bytes) {
        temp = Integer.toHexString(aByte & 0xFF);
        if (temp.length() == 1) {
            stringBuffer.append("0");
        }
        stringBuffer.append(temp);
    }
    return stringBuffer.toString();
}

クライアント側のサンプルコード

Android用のJavaサンプルコードを表示する

// The values of appId, channelId, userId, nonce, timestamp, and token must be the same as the values on the server side.
// username is an identifier used for troubleshooting purposes.
AliRtcAuthInfo userInfo = new AliRtcAuthInfo();
userInfo.setAppId("xxx");
userInfo.setChannelId("xxx");
userInfo.setUserId("xxx");
userInfo.setNonce("xxx");
userInfo.setTimestamp(xxx);
userInfo.setGslb(new String[]{"https://gw.rtn.aliyuncs.com"});
userInfo.setToken("xxx");
mAliRtcEngine.joinChannel(userInfo, "username");

iOS用のObjective-Cサンプルコードを表示する

Show Objective-C sample code for iOS
// The values of appId, channelId, userId, nonce, timestamp, and token must be the same as the values on the server side.
// username is an identifier used for troubleshooting purposes.
AliRtcAuthInfo *authInfo = [[AliRtcAuthInfo alloc] init];
NSMutableArray *gslb = [[NSMutableArray alloc] init];
[gslb addObject:@"https://gw.rtn.aliyuncs.com"];
authInfo.appId = @"xxx";
authInfo.channelId   = @"xxx";
authInfo.userId   = @"xxx";
authInfo.nonce = @"";
authInfo.timestamp = xxxxx;
authInfo.gslb = gslb;
authInfo.token = @"";
[self.engine joinChannel:authInfo name:@"username" onResultWithUserId:nil];

同時ストリーミング

  • コストリーミングまたはバトルシナリオでは、取り込みURLとストリーミングURLは次の形式になります。

    取り込みURL:

    artc://live.aliyun.com/push/633?timestamp=1685094092&token=fe4e674ade****6686&userId=718&sdkAppId=xxx

    ストリーミングURL:

    artc://live.aliyun.com/play/633?timestamp=1685094092&token=fe4e674ade****6686&userId=718&sdkAppId=xxx
    説明

    live.aliyun.comは、共同ストリーミング用のURLの固定フィールドです。 実際のドメイン名ではありません。 ping、traceroute、telentなどのドメイン関連の操作は実行しないでください。