Token adalah tanda tangan keamanan yang mencegah akses tidak sah ke layanan cloud Anda. Token ini dihasilkan di server Anda dan didistribusikan ke SDK client untuk bergabung ke channel.
Prasyarat
-
Anda memiliki Akun Alibaba Cloud dan layanan ApsaraVideo Live telah diaktifkan.
-
Anda telah membuat aplikasi ARTC serta memperoleh AppID dan AppKey-nya. Untuk informasi selengkapnya, lihat Buat aplikasi ARTC.
Kode contoh
Pembuatan sisi server (disarankan)
Alibaba Cloud menyediakan contoh kode untuk Go, Java, Python, dan bahasa lainnya. Lihat Contoh kode pembuatan token.
Pembuatan sisi client (hanya untuk pengembangan dan debugging)
Karena pembuatan token memerlukan AppKey Anda, menyematkannya dalam kode sisi client menimbulkan risiko keamanan serius. Untuk aplikasi produksi, hasilkan token di server aplikasi Anda lalu distribusikan ke client.
Selama pengembangan dan debugging, jika server aplikasi Anda belum menghasilkan token, Anda dapat sementara waktu menghasilkannya di sisi client dengan mengacu pada logika APIExample. Kode contoh:
Hasilkan token di client Android: Android/ARTCExample/KeyCenter/src/main/java/com/aliyun/artc/api/keycenter/ARTCTokenHelper.java
Hasilkan token di client iOS: iOS/ARTCExample/Common/ARTCTokenHelper.swift
Bergabung ke channel dengan token
Untuk aplikasi produksi, kami sangat menyarankan menghasilkan token di server aplikasi Anda dan mendistribusikannya ke client demi menjaga keamanan.
Gunakan token untuk bergabung ke channel di client Android: Android/ARTCExample/QuickStart/src/main/java/com/aliyun/artc/api/quickstart/TokenGenerate/TokenGenerateActivity.java
Gunakan token untuk bergabung ke channel di client iOS: iOS/ARTCExample/QuickStart/TokenGenerate/TokenGenerateVC.swift
Cara kerja
Alur kerja token
-
Client meminta token dari server aplikasi. Server aplikasi menghasilkan token berdasarkan aturan yang ditentukan dan mengembalikannya.
-
Client menggunakan token, AppID, ID channel, ID pengguna, dan informasi lainnya untuk bergabung ke channel yang ditentukan.
-
Layanan ARTC Alibaba Cloud memvalidasi token tersebut sehingga client diperbolehkan bergabung ke channel.
Pembuatan token
Tabel berikut menjelaskan parameter yang digunakan untuk menghasilkan token.
|
Parameter |
Deskripsi |
|
AppID |
ID dan kunci aplikasi ARTC Anda, yang dihasilkan saat Anda membuat aplikasi ARTC di Konsol ApsaraVideo Live. Lihat Dapatkan parameter pengembangan aplikasi. |
|
AppKey |
|
|
ChannelId |
ID channel yang ditentukan pengguna. Nilainya harus berupa string dan tidak boleh berupa Long. ID ini dapat berisi angka, huruf kapital, huruf kecil, tanda hubung (-), dan garis bawah (_), serta panjangnya tidak boleh lebih dari 64 karakter. Host dan tamu co-streaming harus menggunakan ID channel yang sama. |
|
UserID |
ID pengguna yang ditentukan pengguna. Nilainya harus berupa string dan tidak boleh berupa Long. ID ini dapat berisi angka, huruf kapital, huruf kecil, tanda hubung (-), dan garis bawah (_), serta panjangnya tidak boleh lebih dari 64 karakter. |
|
nonce |
Nonce dapat berupa string kosong. Kami menyarankan untuk membiarkannya kosong. |
|
timestamp |
Timestamp kedaluwarsa dalam satuan detik. Kami menyarankan menetapkan masa berlaku selama 24 jam. Untuk menetapkan masa berlaku 24 jam, tambahkan 86.400 (24 * 60 * 60) ke timestamp saat ini dalam satuan detik. |
Contoh proses pembuatan token:

Contoh kode pembuatan token:
// 1. Gabungkan bidang-bidang: AppID+AppKey+ChannelID+UserID+Nonce+Timestamp
// 2. Gunakan algoritma SHA-256 untuk meng-hash string yang digabungkan dan menghasilkan token.
token = sha256(AppID+AppKey+ChannelId+UserID+Nonce+timestamp)
// Contoh:
AppID = "abc",AppKey="abckey",ChannelID="abcChannel",UserID="abcUser",Nonce="",Timestamp=1699423634
token = sha256("abcabckeyabcChannelabcUser1699423634") = "3c9ee8d9f8734f0b7560ed8022a0590659113955819724fc9345ab8eedf84f31"
Skenario ARTC
Contoh berikut menunjukkan cara menggunakan token untuk mengotentikasi pengguna yang bergabung ke channel dalam skenario ARTC di Android dan iOS.
Metode parameter tunggal (disarankan)
SDK ARTC menyediakan API satu parameter untuk bergabung ke channel. Pendekatan ini mencegah kegagalan bergabung akibat ketidakkonsistenan parameter antara server aplikasi dan client. Kemas token, appid, channelid, nonce, userid, dan timestamp ke dalam objek JSON, lalu encode string JSON tersebut dengan Base64 untuk membuat string otentikasi baru (token Base64).
Saat menghubungi Alibaba Cloud untuk dukungan teknis, Anda harus memberikan token Base64 atau username yang dikirimkan.

Contoh pembuatan token Base64
Java
package com.example;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Calendar;
import org.json.JSONObject;
public class App {
public static String createBase64Token(String appid, String appkey, String channelid, String userid) {
// Hitung timestamp kedaluwarsa (24 jam dari sekarang)
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, 24);
long timestamp = calendar.getTimeInMillis() / 1000;
// Gabungkan string
String stringBuilder = appid + appkey + channelid + userid + timestamp;
// Hitung hash SHA-256
String token = sha256(stringBuilder);
// Buat objek JSON
JSONObject base64tokenJson = new JSONObject();
base64tokenJson.put("appid", appid);
base64tokenJson.put("channelid", channelid);
base64tokenJson.put("userid", userid);
base64tokenJson.put("nonce", "");
base64tokenJson.put("timestamp", timestamp);
base64tokenJson.put("token", token);
// Konversi objek JSON ke string dan encode dalam Base64
String jsonStr = base64tokenJson.toString();
String base64token = Base64.getEncoder().encodeToString(jsonStr.getBytes(StandardCharsets.UTF_8));
return base64token;
}
private static String sha256(String input) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1)
hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
String appid = "your_appid";
String appkey = "your_appkey";
String channel_id = "your_channel_id";
String user_id = "your_user_id";
String base64token = createBase64Token(appid, appkey, channel_id, user_id);
System.out.println("Base64 Token: " + base64token);
}
}
Go
package main
import (
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
"time"
)
func createBase64Token(appid, appkey, channelID, userID string) (string, error) {
// Hitung timestamp kedaluwarsa (24 jam dari sekarang)
timestamp := time.Now().Add(24 * time.Hour).Unix()
// Gabungkan string
stringBuilder := appid + appkey + channelID + userID + fmt.Sprintf("%d", timestamp)
// Hitung hash SHA-256
hasher := sha256.New()
hasher.Write([]byte(stringBuilder))
token := hasher.Sum(nil)
// Konversi hash ke string heksadesimal menggunakan encoding/hex
tokenHex := hex.EncodeToString(token)
// Buat objek JSON
tokenJSON := map[string]interface{}{
"appid": appid,
"channelid": channelID,
"userid": userID,
"nonce": "",
"timestamp": timestamp,
"token": tokenHex,
}
// Konversi objek JSON ke string dan encode dalam Base64
jsonBytes, err := json.Marshal(tokenJSON)
if err != nil {
return "", err
}
base64Token := base64.StdEncoding.EncodeToString(jsonBytes)
return base64Token, nil
}
func main() {
appid := "your_appid"
appkey := "your_appkey"
channelID := "your_channel_id"
userID := "your_user_id"
token, err := createBase64Token(appid, appkey, channelID, userID)
if err != nil {
fmt.Println("Error creating token:", err)
return
}
fmt.Println("Base64 Token:", token)
}
Python
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import hashlib
import datetime
import time
import base64
import json
def create_base64_token(app_id, app_key, channel_id, user_id):
expire = datetime.datetime.now() + datetime.timedelta(days=1)
timestamp = int(time.mktime(expire.timetuple()))
h = hashlib.sha256()
h.update(str(app_id).encode('utf-8'))
h.update(str(app_key).encode('utf-8'))
h.update(str(channel_id).encode('utf-8'))
h.update(str(user_id).encode('utf-8'))
h.update(str(timestamp).encode('utf-8'))
token = h.hexdigest()
jsonToken = {'appid':app_id,
'channelid':channel_id,
'userid':user_id,
'nonce':'',
'timestamp':timestamp,
'token':token
}
base64Token = base64.b64encode(json.dumps(jsonToken).encode())
return base64Token
def main():
app_id = 'your_appid'
app_key = 'your_appkey'
channel_id = 'your_channel_id'
user_id = 'your_user_id'
base64Token = create_base64_token(app_id, app_key, channel_id, user_id)
print(base64Token)
if __name__ == '__main__':
main()
Node.js
'use strict'
const crypto = require('crypto')
function create_base64_token(appid, appkey, channelid, userid) {
let timestamp = Math.floor(Date.now() / 1000 + 24 * 60 * 60)
let string_builder = appid + appkey + channelid + userid + timestamp.toString()
let token = crypto.createHash('sha256').update(string_builder).digest('hex')
let base64tokenJson = {
appid:appid,
channelid:channelid,
userid:userid,
nonce:'',
timestamp:timestamp,
token:token
}
let base64token = Buffer.from(JSON.stringify(base64tokenJson), 'utf-8').toString('base64')
return base64token
}
let appid = "your_appid";
let appkey = "your_appkey";
let channel_id = "your_channel_id";
let user_id = "your_user_id";
let base64token = create_base64_token(appid, appkey, channel_id, user_id)
console.log(base64token)
Rust
use chrono::{Duration, Utc};
use sha2::{Sha256, Digest};
use serde_json::json;
use base64::encode;
fn create_base64_token(appid: &str, appkey: &str, channel_id: &str, user_id: &str) -> String {
// Hitung timestamp kedaluwarsa (24 jam dari sekarang)
let timestamp = (Utc::now() + Duration::hours(24)).timestamp();
// Gabungkan string
let string_builder = format!("{}{}{}{}{}", appid, appkey, channel_id, user_id, timestamp);
// Hitung hash SHA-256
let mut hasher = Sha256::new();
hasher.update(string_builder);
let token = hasher.finalize();
let token_hex = format!("{:x}", token);
// Buat objek JSON
let token_json = json!({
"appid": appid,
"channelid": channel_id,
"userid": user_id,
"nonce": "",
"timestamp": timestamp,
"token": token_hex
});
// Konversi objek JSON ke string dan encode dalam Base64
let base64_token = encode(token_json.to_string());
base64_token
}
fn main() {
let appid = "your_appid";
let appkey = "your_appkey";
let channel_id = "your_channel_id";
let user_id = "your_user_id";
let token = create_base64_token(appid, appkey, channel_id, user_id);
println!("Base64 Token: {}", token);
}
Contoh pemanggilan API client
Setelah client memperoleh token Base64 dari server aplikasi Anda, client tersebut menggunakan token tersebut untuk bergabung ke channel.
-
Android:
// Anda dapat mengatur channelId dan userId ke null. Jika Anda memberikan nilai untuk channelId dan userId, nilainya harus sesuai dengan yang digunakan untuk menghasilkan token. Fitur ini dapat digunakan untuk memverifikasi konsistensi parameter antara server dan client. // base64Token adalah token yang di-encode Base64. // username adalah identifikasi yang dikirimkan untuk keperluan troubleshooting. mAliRtcEngine.joinChannel(base64Token, null, null, "username"); -
iOS:
// Anda dapat mengatur channelId dan userId ke null. Jika Anda memberikan nilai untuk channelId dan userId, nilainya harus sesuai dengan yang digunakan untuk menghasilkan token. Fitur ini dapat digunakan untuk memverifikasi konsistensi parameter antara server dan client. // base64Token adalah token yang di-encode Base64. // username adalah identifikasi yang dikirimkan untuk keperluan troubleshooting. [self.engine joinChannel:base64Token channelId:nil userId:nil name:@"username" onResultWithUserId:nil];
Metode multi-parameter
SDK ARTC juga menyediakan API multi-parameter untuk bergabung ke channel. Metode ini menggunakan struktur data AliRtcAuthInfo untuk menyimpan token dan informasi pengguna guna otentikasi.
ID channel dan ID pengguna yang digunakan untuk bergabung ke channel harus sesuai dengan yang digunakan untuk menghasilkan token.
-
Android:
// Kirim token dan informasi pengguna untuk metode multi-parameter. AliRtcAuthInfo authInfo = new AliRtcAuthInfo(); authInfo.appId = appId; authInfo.channelId = channelId; authInfo.userId = userId; authInfo.timestamp = timestamp; authInfo.nonce = nonce; authInfo.token = token; // Bergabung ke channel. mAliRtcEngine.joinChannel(authInfo, ""); -
iOS:
// Kirim token dan informasi pengguna untuk metode multi-parameter. let authInfo = AliRtcAuthInfo() authInfo.appId = appId authInfo.channelId = channelId authInfo.nonce = nonce authInfo.userId = userId authInfo.timestamp = timestamp authInfo.token = authToken // Bergabung ke channel. self.rtcEngine?.joinChannel(authInfo, name: nil)
Skenario co-streaming
Tambahkan parameter token, AppID, ChannelID, nonce, userId, dan timestamp ke string query URL co-streaming, lalu kirimkan URL tersebut ke SDK. Untuk detail tentang bidang-bidang URL, lihat Aturan URL co-streaming.
Contoh URL
URL ingest untuk skenario co-streaming atau battle:
artc://live.aliyun.com/push/633?timestamp=1685094092&token=fe4e674ade****6686&userId=718&sdkAppId=xxx
URL streaming untuk skenario co-streaming atau battle:
artc://live.aliyun.com/play/633?timestamp=1685094092&token=fe4e674ade****6686&userId=718&sdkAppId=xxx
live.aliyun.com adalah awalan tetap untuk URL co-streaming dan bukan nama domain yang sebenarnya. Jangan lakukan operasi terkait domain, seperti ping, traceroute, atau telnet, padanya.
Penanganan kedaluwarsa token
Saat membuat token, bidang timestamp menentukan waktu kedaluwarsanya.
Setelah pengguna bergabung ke channel menggunakan token:
-
SDK memicu callback
onAuthInfoWillExpire30 detik sebelum token kedaluwarsa. Anda dapat memanggil metoderefreshAuthInfountuk memperbarui informasi otentikasi. -
Saat token kedaluwarsa, SDK memicu callback
onAuthInfoExpired. Agar tetap berada di channel, pengguna harus bergabung kembali ke channel tersebut.