Todos os produtos
Search
Central de documentação

ApsaraVideo Live:Implementar autenticação baseada em token

Última atualização: Jul 05, 2026

Tokens são credenciais de segurança que protegem seus serviços em nuvem contra acessos não autorizados. No ApsaraVideo Real-time Communication (ARTC), o servidor da aplicação gera um token e o envia ao cliente. O SDK do ARTC no lado do cliente usa esse token para entrar em um canal; o acesso é concedido somente após a autenticação bem-sucedida.

Pré-requisitos

  • Conta Alibaba Cloud criada e ApsaraVideo Live ativado.

  • Aplicação ARTC criada, com AppID e AppKey obtidos.

Código de exemplo

Geração de token no servidor (recomendado)

O ApsaraVideo Live fornece exemplos de código para geração de tokens em várias linguagens, incluindo Go, Java e Python. Para mais detalhes, visite o repositório no GitHub.

Geração de token no cliente (apenas para desenvolvimento e testes)

Importante

A geração de tokens requer uma AppKey. Codificar a AppKey diretamente no cliente gera um risco de segurança. Em ambientes de produção, gere os tokens no servidor de negócios e envie-os ao cliente.

Se a geração de tokens no servidor ainda não estiver implementada, use o código de exemplo no APIExample para gerar tokens temporários durante o desenvolvimento e os testes:

Android: Android/ARTCExample/KeyCenter/src/main/java/com/aliyun/artc/api/keycenter/ARTCTokenHelper.java

iOS: iOS/ARTCExample/Common/ARTCTokenHelper.swift

Entrada em um canal com token

Nota

Em todas as aplicações em produção e ao vivo, gere os tokens em um servidor e transmita-os ao cliente. O método de geração de tokens no lado do cliente nos exemplos abaixo é inseguro e destina-se apenas a depuração e demonstração.

Android: Android/ARTCExample/QuickStart/src/main/java/com/aliyun/artc/api/quickstart/TokenGenerate/TokenGenerateActivity.javaiOS: iOS/ARTCExample/QuickStart/TokenGenerate/TokenGenerateVC.swift

Como funciona

Procedimento

image
  1. O cliente solicita um token ao servidor da aplicação. O servidor gera o token conforme regras predefinidas e o retorna ao cliente.

  2. O cliente usa o token recebido e outras informações necessárias, como appId, channelId e userId, para solicitar entrada no canal especificado.

  3. O servidor ARTC verifica o token e admite o cliente no canal após a verificação bem-sucedida.

Método de geração de token

A tabela a seguir descreve os campos usados na geração do token.

Campo

Descrição

AppID

ID e chave da aplicação gerados automaticamente ao criar uma aplicação ARTC no console. Para mais informações, consulte Obter parâmetros de desenvolvimento.

AppKey

ChannelID

ID personalizado do canal. Deve ser uma string e pode conter dígitos, letras, hifens (-) e sublinhados (_), com comprimento máximo de 64 caracteres.

Todos os participantes da mesma sessão (anfitrião e coanfitriões) devem usar o mesmo ChannelID.

UserId

ID personalizado do usuário. Deve ser uma string e pode conter dígitos, letras, hifens (-) e sublinhados (_), com comprimento máximo de 64 caracteres.

Nonce

String nonce. Recomendamos deixar este campo vazio.

Timestamp

Timestamp de expiração do token, em segundos. O valor recomendado é 24 horas: adicione 86400 (24 × 60 × 60) ao timestamp UNIX atual.

Procedimento de geração de token:

yuque_diagram (1)

Exemplo de código:

// 1. Concatenate the following fields: AppID+AppKey+ChannelID+UserID+Nonce+Timestamp
// 2. Use the sha256 function on the concatenated string to 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 gerais do ARTC

Use um token para autenticar um cliente que entra em um canal. Há exemplos disponíveis para Android e iOS.

O SDK do ARTC oferece dois métodos para entrar em um canal: parâmetro único e múltiplos parâmetros. Esses métodos são fundamentais e aplicáveis a todos os cenários do ARTC.

Método de parâmetro único (recomendado)

O SDK do ARTC fornece uma API simplificada de parâmetro único para entrar em um canal. Esse método é recomendado porque evita falhas de entrada causadas por inconsistências entre os parâmetros gerados pelo servidor e os valores fornecidos pelo cliente.

Para usar esse método, combine os parâmetros Token, AppID, ChannelID, Nonce, UserID e Timestamp em um objeto JSON. Em seguida, codifique a string JSON em Base64 para gerar uma nova string de autenticação (token Base64).

Nota

Ao abrir um ticket para solução de problemas, forneça o token Base64 ou o userName passado na chamada joinChannel.

yuque_diagram (3)

Lado do servidor: Gerar 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)

xRust

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);
}

Lado do cliente: Chamar joinChannel

Após receber o Base64 token do servidor, o cliente chama a API joinChannel para entrar em um canal:

  • Android:

    // You can pass null for channelId and userId, as their values are included in the Base64 token. If you do provide them, they must match the values used to generate the token. This feature can be used to verify parameter consistency between your server and the client. 
    // base64Token is the Base64-encoded token.
    // username is an identity that you can pass for troubleshooting.
    mAliRtcEngine.joinChannel(base64Token, null, null, "username");
  • iOS:

    // You can pass null for channelId and userId, as their values are included in the Base64 token. If you do provide them, they must match the values used to generate the token. This feature can be used to verify parameter consistency between your server and the client. 
    // base64Token is the Base64-encoded token.
    // username is an identity that you can pass for troubleshooting.
    [self.engine joinChannel:base64Token channelId:nil userId:nil name:@"username" onResultWithUserId:nil];

Método de múltiplos parâmetros

O SDK do ARTC também fornece uma API de múltiplos parâmetros para entrar em um canal. Esse método usa a estrutura de dados AliRtcAuthInfo para passar o token e as informações do usuário.

Importante

O channelId e o userId devem corresponder aos valores usados para gerar o token.

  • Android:

    // Pass the token and user information.
    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.
    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 co-streaming

Para cenários de co-streaming, o SDK do ARTC suporta um método de autenticação simplificado. Adicione os campos Token, AppID, ChannelID, Nonce, UserID e Timestamp como parâmetros de consulta à URL artc:// de co-streaming. Para detalhes sobre a geração de URLs do ARTC, consulte Regras de URL de co-streaming.

O diagrama a seguir ilustra o fluxo de trabalho de autenticação de co-streaming:

image

Exemplos de URLs para co-streaming ou batalha ao vivo

URL de push:

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

URL de pull:

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

live.aliyun.com é um prefixo fixo para URLs de co-streaming e não é um nome de domínio resolvível. Não é possível usá-lo para operações relacionadas a domínio, como ping, traceroute ou telnet.

Tratamento de expiração de token

O campo Timestamp em um token especifica seu tempo de expiração.

Depois que um usuário entra em um canal com um token:

  • 30 segundos antes da expiração do token, o SDK aciona o callback onAuthInfoWillExpire. Chame o método refreshAuthInfo para atualizar as informações de autenticação.

  • Quando o token expira, o SDK aciona o callback onAuthInfoExpired. Para permanecer no canal, o usuário deve entrar novamente.