Tokens são assinaturas de segurança que impedem o acesso não autorizado aos seus service em cloud. Gere um token no servidor e distribua-o ao SDK do cliente, que o utiliza para entrar em um canal.
Pré-requisitos
Ter uma conta Alibaba Cloud com o service ApsaraVideo Live ativado.
Crie um aplicativo ARTC e obter o AppID e a AppKey correspondentes. Para mais informações, consulte Create an ARTC application.
Exemplos de código
Geração no lado do servidor (recomendado)
A Alibaba Cloud fornece exemplos de código para Go, Java, Python e outras linguagens. Consulte Exemplos de código para geração de token.
Geração no lado do cliente (apenas para desenvolvimento e depuração)
Como a geração de um token exige a AppKey, incorporá-la ao código do cliente representa um risco grave de segurança. Em aplicações de produção, gere os tokens no servidor da aplicação e distribua-os ao cliente.
Durante o desenvolvimento e a depuração, caso o servidor da aplicação ainda não gere tokens, gere um temporariamente no cliente seguindo a lógica do APIExample. Código de exemplo:
Gerar um token em um cliente Android: Android/ARTCExample/KeyCenter/src/main/java/com/aliyun/artc/api/keycenter/ARTCTokenHelper.java
Gerar um token em um cliente iOS: iOS/ARTCExample/Common/ARTCTokenHelper.swift
Entrar em um canal com um token
Para aplicações em produção, recomendamos fortemente gerar os tokens no servidor da aplicação e distribuí-los ao cliente para garantir a segurança.
Usar um token para entrar em um canal em um cliente Android: Android/ARTCExample/QuickStart/src/main/java/com/aliyun/artc/api/quickstart/TokenGenerate/TokenGenerateActivity.javaUsar um token para entrar em um canal em um cliente iOS: iOS/ARTCExample/QuickStart/TokenGenerate/TokenGenerateVC.swift
Como funciona
Fluxo de trabalho do token
O cliente solicita um token ao servidor da aplicação. O servidor gera o token conforme as regras exigidas e o retorna.
O cliente utiliza o token, o AppID, o ID do canal, o ID do usuário e outras informações para entrar no canal especificado.
O service ARTC da Alibaba Cloud valida o token e permite a entrada do cliente no canal.
Geração de token
A tabela a seguir descreve os parâmetros usados na geração de um token.
|
Parâmetro |
Descrição |
|
AppID |
ID e chave do aplicativo ARTC, gerados durante a criação do aplicativo no console do ApsaraVideo Live. Consulte Get application development parameters. |
|
AppKey |
|
|
ChannelId |
ID de canal definido pelo usuário. O valor deve ser uma string e não pode ser do tipo Long. Pode conter dígitos, letras maiúsculas, letras minúsculas, hifens (-) e sublinhados (_), com limite de 64 caracteres. O anfitrião e os convidados da transmissão conjunta devem usar o mesmo ID de canal. |
|
UserID |
ID de usuário definido pelo usuário. O valor deve ser uma string e não pode ser do tipo Long. Pode conter dígitos, letras maiúsculas, letras minúsculas, hifens (-) e sublinhados (_), com limite de 64 caracteres. |
|
nonce |
O nonce pode ser uma string vazia. Recomendamos deixá-lo vazio. |
|
timestamp |
Timestamp de expiração em segundos. Recomendamos defina a expiração para 24 horas. Para configurar uma expiração de 24 horas, adicione 86.400 (24 60 60) ao timestamp atual em segundos. |
Exemplo do processo de geração de token:

Exemplo de código para geração de token:
// 1. Concatenate the fields: AppID+AppKey+ChannelID+UserID+Nonce+Timestamp
// 2. Use the SHA-256 algorithm to hash the concatenated string and generate the token.
token = sha256(AppID+AppKey+ChannelId+UserID+Nonce+timestamp)
// Example:
AppID = "abc",AppKey="abckey",ChannelID="abcChannel",UserID="abcUser",Nonce="",Timestamp=1699423634
token = sha256("abcabckeyabcChannelabcUser1699423634") = "3c9ee8d9f8734f0b7560ed8022a0590659113955819724fc9345ab8eedf84f31"
Cenários ARTC
Os exemplos a seguir mostram como usar um token para autenticar usuários que entram em um canal em um cenário ARTC no Android e iOS.
Método de parâmetro único (recomendado)
O SDK ARTC oferece uma API de parâmetro único para entrar em um canal. Essa abordagem evita falhas na entrada do canal causadas por inconsistências de parâmetros entre o servidor da aplicação e o cliente. Empacote o token de autenticação, appid, channelid, nonce, userid e timestamp em um objeto json e codifique a string json em Base64 para crie uma nova string de autenticação (token Base64).
Ao contatar o suporte técnico da Alibaba Cloud, forneça o token Base64 ou o nome de usuário transmitido.

Exemplo de geração de 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) {
// Calculate the expiration timestamp (24 hours from now)
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, 24);
long timestamp = calendar.getTimeInMillis() / 1000;
// Concatenate the strings
String stringBuilder = appid + appkey + channelid + userid + timestamp;
// Calculate the SHA-256 hash
String token = sha256(stringBuilder);
// Create the JSON object
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);
// Convert the JSON object to a string and encode it in 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) {
// Calculate the expiration timestamp (24 hours from now)
timestamp := time.Now().Add(24 * time.Hour).Unix()
// Concatenate the strings
stringBuilder := appid + appkey + channelID + userID + fmt.Sprintf("%d", timestamp)
// Calculate the SHA-256 hash
hasher := sha256.New()
hasher.Write([]byte(stringBuilder))
token := hasher.Sum(nil)
// Convert the hash to a hexadecimal string using encoding/hex
tokenHex := hex.EncodeToString(token)
// Create the JSON object
tokenJSON := map[string]interface{}{
"appid": appid,
"channelid": channelID,
"userid": userID,
"nonce": "",
"timestamp": timestamp,
"token": tokenHex,
}
// Convert the JSON object to a string and encode it in 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 {
// Calculate the expiration timestamp (24 hours from now)
let timestamp = (Utc::now() + Duration::hours(24)).timestamp();
// Concatenate the strings
let string_builder = format!("{}{}{}{}{}", appid, appkey, channel_id, user_id, timestamp);
// Calculate the SHA-256 hash
let mut hasher = Sha256::new();
hasher.update(string_builder);
let token = hasher.finalize();
let token_hex = format!("{:x}", token);
// Create the JSON object
let token_json = json!({
"appid": appid,
"channelid": channel_id,
"userid": user_id,
"nonce": "",
"timestamp": timestamp,
"token": token_hex
});
// Convert the JSON object to a string and encode it in 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);
}
Exemplos de chamada de API do cliente
Após obter o Base64 token do servidor da aplicação, o cliente usa o token para entrar no canal.
-
Android:
// You can set channelId and userId to null. If you pass values for channelId and userId, they must match those used to generate the token. You can use this feature to verify parameter consistency between the server and the client. // base64Token is the Base64-encoded token. // username is an identifier passed for troubleshooting purposes. mAliRtcEngine.joinChannel(base64Token, null, null, "username"); -
iOS:
// You can set channelId and userId to null. If you pass values for channelId and userId, they must match those used to generate the token. You can use this feature to verify parameter consistency between the server and the client. // base64Token is the Base64-encoded token. // username is an identifier passed for troubleshooting purposes. [self.engine joinChannel:base64Token channelId:nil userId:nil name:@"username" onResultWithUserId:nil];
Método de múltiplos parâmetros
O SDK ARTC também disponibiliza uma API de múltiplos parâmetros para entrada em canais. Este método utiliza a estrutura de dados AliRtcAuthInfo para armazenar o token e as informações do usuário necessárias à autenticação.
O ID do canal e o ID do usuário usados para entrar no canal devem corresponder exatamente aos utilizados na geração do token.
-
Android:
// Pass the token and user information for the multi-parameter method. AliRtcAuthInfo authInfo = new AliRtcAuthInfo(); authInfo.appId = appId; authInfo.channelId = channelId; authInfo.userId = userId; authInfo.timestamp = timestamp; authInfo.nonce = nonce; authInfo.token = token; // Join the channel. mAliRtcEngine.joinChannel(authInfo, ""); -
iOS:
// Pass the token and user information for the multi-parameter method. let authInfo = AliRtcAuthInfo() authInfo.appId = appId authInfo.channelId = channelId authInfo.nonce = nonce authInfo.userId = userId authInfo.timestamp = timestamp authInfo.token = authToken // Join the channel. self.rtcEngine?.joinChannel(authInfo, name: nil)
Cenários de transmissão conjunta
Adicione os parâmetros token, AppID, ChannelID, nonce, userId e timestamp à string query da URL de transmissão conjunta e passe a URL ao SDK. Para detalhes sobre os campos da URL, consulte Co-streaming URL rules.
Exemplos de URLs
URL de ingestão para cenários de transmissão conjunta ou batalha:
artc://live.aliyun.com/push/633?timestamp=1685094092&token=fe4e674ade****6686&userId=718&sdkAppId=xxx
URL de streaming para cenários de transmissão conjunta ou batalha:
artc://live.aliyun.com/play/633?timestamp=1685094092&token=fe4e674ade****6686&userId=718&sdkAppId=xxx
live.aliyun.com é um prefixo fixo para URLs de transmissão conjunta e não constitui um nome de domínio real. Não execute operações relacionadas a domínios, como ping, traceroute ou telnet, neste endereço.
Tratamento de expiração de token
Ao crie um token, o campo timestamp define seu tempo de expiração.
Depois que um usuário entra em um canal usando um token:
O SDK aciona o callback
onAuthInfoWillExpire30 segundos antes da expiração do token. Chame o métodorefreshAuthInfopara atualize as informações de autenticação.Quando o token expira, o SDK dispara o callback
onAuthInfoExpired. Para permanecer no canal, o usuário precisa entrar novamente.