日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Token鑒權(quán)

更新時(shí)間:

本文介紹實(shí)時(shí)音視頻場(chǎng)景下,Token字段的生成規(guī)則。

前提條件

背景信息

Token是阿里云設(shè)計(jì)的一種安全保護(hù)簽名,目的是為了阻止惡意攻擊者盜用您的云服務(wù)使用權(quán)。您需要在相應(yīng)SDK的登錄函數(shù)中提供AppIDUserIDChannelIdNonceTimeStampToken信息。其中AppID用于標(biāo)識(shí)您的應(yīng)用,UserID用于標(biāo)識(shí)您的用戶,而Token是基于上述參數(shù)(AppIDAppKeyChannelIDNonceUserIDTimestamp)計(jì)算得出。因此,攻擊者很難通過偽造Token盜用您的云服務(wù)流量。

阿里云SDK為了讓客戶更加方便的使用,針對(duì)不同業(yè)務(wù)場(chǎng)景封裝了ARTC場(chǎng)景API入會(huì)、直播連麥API入會(huì)兩種使用形式。

Token原理及計(jì)算方法

Token的計(jì)算原理及方法如下,開發(fā)者可以根據(jù)如下方法計(jì)算Token。

// 1. AppID+AppKey+ChannelID+UserID+Nonce+timestamp 產(chǎn)生原始字符串
// 2. sha256計(jì)算后轉(zhuǎn)為token字符串
// 3. 客戶可以通過下面的示例看看自己的算法是否正確
// AppID="abc",AppKey="abckey",ChannelID="abcChannel",UserID="abcUser",Nonce="",timestamp=1699423634
// token = sha256("abcabckeyabcChannelabcUser1699423634") = "3c9ee8d9f8734f0b7560ed8022a0590659113955819724fc9345ab8eedf84f31"
// 4. 特別說明: Nonce字符串可以為空,這里推薦為空;timestamp取當(dāng)前秒數(shù)后再增加24*60*60
token = sha256(AppID+AppKey+ChannelId+UserID+Nonce+timestamp)

Token生成相關(guān)字段說明:

參數(shù)名稱

描述

AppID

實(shí)時(shí)音視頻應(yīng)用ID,在直播控制臺(tái)創(chuàng)建實(shí)時(shí)音視頻應(yīng)用后會(huì)自動(dòng)生成。請(qǐng)參見創(chuàng)建實(shí)時(shí)音視頻應(yīng)用

AppKey

在直播控制臺(tái)實(shí)時(shí)音視頻應(yīng)用管理頁面,可以查詢AppKey,請(qǐng)參見查詢AppKey

channelID

頻道ID,由用戶自定義,支持?jǐn)?shù)字、大小寫字母、短劃線(-)、下劃線(_),不超過64個(gè)字符。主播和連麥觀眾需使用同一個(gè)房間號(hào)。

userId

用戶ID,由用戶自定義,支持?jǐn)?shù)字、大小寫字母、短劃線(-)、下劃線(_),長度不超過64個(gè)字符。

nonce

Nonce字符串可以為空,這里推薦為空。

timestamp

過期時(shí)間戳(秒級(jí))。不能超過24小時(shí),建議默認(rèn)24小時(shí)。

服務(wù)器側(cè)計(jì)算上面的Token后,根據(jù)業(yè)務(wù)情況有如下三種處理方式。

  • 方式一(此方式為多參數(shù)入會(huì)):將Token及計(jì)算用的5個(gè)參數(shù)(AppID、 ChannelIDNonceUserIDTimestamp)生成JSON結(jié)構(gòu)透傳至App側(cè),App側(cè)將參數(shù)原封不動(dòng)的透傳至ARTC SDK,并把其中的數(shù)據(jù)在App側(cè)進(jìn)行本地收集,在進(jìn)行阿里云技術(shù)支持時(shí)貼上相關(guān)信息。

  • 方式二(此方式為單參數(shù)入會(huì)):將Token及計(jì)算用的5個(gè)參數(shù)(AppID、 ChannelIDNonceUserIDTimestamp)生成JSON后進(jìn)行Base 64編碼,通過一個(gè)字符串Base 64 Token透傳至App側(cè),App側(cè)透傳Base 64 Token至ARTC SDK,同時(shí)傳入排查問題使用的UserName字段。

  • 方式三:將Token及計(jì)算用的5個(gè)參數(shù)(AppID、 ChannelIDNonceUserIDTimestamp)生成URL,傳入直播連麥SDK即可。

image

業(yè)務(wù)場(chǎng)景

ARTC場(chǎng)景

ARTC場(chǎng)景下提供單參數(shù)入會(huì)、多參數(shù)入會(huì)兩種形式的API,其中單參數(shù)入會(huì)的形式主要是為了客戶自身服務(wù)器與App傳入?yún)?shù)不一致引起入會(huì)失敗而開發(fā)的類似語法糖的使用方式,這里推薦客戶使用單參數(shù)入會(huì)進(jìn)行開發(fā)。

單參數(shù)入會(huì)

單參數(shù)入會(huì)是通過把鑒權(quán)Token、計(jì)算的6個(gè)參數(shù)、gslb參數(shù)通過JSON組織起來,然后把JSON字符串進(jìn)行Base64編碼后算出一個(gè)新的鑒權(quán)字符串。這樣客戶的Appserver和App只需要通過一個(gè)參數(shù)進(jìn)行交互,避免數(shù)據(jù)不一致造成的接入失敗。

后續(xù)給阿里云反饋問題時(shí)需要提供Base64Token或者傳入的UserName。

服務(wù)器側(cè)代碼示例

展開查看Java代碼示例

/**
 * 根據(jù) appid,appkey,channelId,userId,nonc,timestamp 生成 token
 *
 * @param appid     應(yīng)用ID。在控制臺(tái)應(yīng)用管理頁面創(chuàng)建和查看。
 * @param appkey    在控制臺(tái)應(yīng)用管理頁面創(chuàng)建和查看。
 * @param channelId 房間 ID
 * @param userId    用戶 ID
 * @return token
 */
public static String createBase64Token(String appid, String appkey, String channelId, String userId) {
    /* 過期時(shí)間戳最大24小時(shí) */
    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;
}

/**
 * 字符串簽名
 *
 * @param str 輸入源
 * @return 返回簽名
 */
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()

App調(diào)用API示例

  • Android側(cè)Java代碼示例:

    // channelid, userid傳入null即可;客戶端如果要傳入channelid、userid但是必須要和產(chǎn)生token用的一致,客戶可以使用這個(gè)特性進(jìn)行校驗(yàn)服務(wù)器和客戶端參數(shù)是否一致
    // base64Token是base64后的token
    // username是方便排查問題時(shí)客戶傳入的標(biāo)識(shí)
    mAliRtcEngine.joinChannel(base64Token, null, null, "username");
  • iOS側(cè)OC代碼示例:

    // channelid, userid傳入null即可;客戶端如果要傳入channelid、userid但是必須要和產(chǎn)生token用的一致,客戶可以使用這個(gè)特性進(jìn)行校驗(yàn)服務(wù)器和客戶端參數(shù)是否一致
    // base64Token是base64后的token
    // username是方便排查問題時(shí)客戶傳入的標(biāo)識(shí)
    [self.engine joinChannel:base64Token channelId:nil userId:nil name:@"username" onResultWithUserId:nil];

多參數(shù)入會(huì)

多參數(shù)入會(huì)是鑒權(quán)的Token及計(jì)算Token的參數(shù)通過一個(gè)authinfo參數(shù)送入SDK的方式,使用此方式時(shí)需要服務(wù)器側(cè)把Token及相關(guān)的參數(shù)全部發(fā)送至App,App將參數(shù)解析為authinfo結(jié)構(gòu)后不做任何變更直接調(diào)用SDK。

后續(xù)給阿里云反饋問題時(shí)需要提供authinfo或者傳入的UserName。

服務(wù)器側(cè)代碼示例

展開查看Java代碼示例

/**
 * 根據(jù) appid,appkey,channelId,userId,nonc,timestamp 生層 token
 *
 * @param appid     應(yīng)用ID。在控制臺(tái)應(yīng)用管理頁面創(chuàng)建和查看。
 * @param appkey    在控制臺(tái)應(yīng)用管理頁面創(chuàng)建和查看。
 * @param channelId 房間 ID
 * @param userId    用戶 ID
 * @param timestamp 過期時(shí)間戳
 * @return token
 */
public static String createToken(String appid, String appkey, String channelId, String userId) {
    /* 過期時(shí)間戳最大24小時(shí) */
    long timestamp = Calendar.getInstance().add(Calendar.HOUR_OF_DAY, 24).getTimeInMillis() / 1000;
    String stringBuilder = appid +
            appkey +
            channelId +
            userId +
            timestamp;
    return getSHA256(stringBuilder);
}

/**
 * 字符串簽名
 *
 * @param str 輸入源
 * @return 返回簽名
 */
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();
}

App調(diào)用API示例

展開查看Android側(cè)Java代碼示例

// appid,channelid,userid,nonce,timestamp,token必須和服務(wù)器計(jì)算的一致
// username是方便排查問題時(shí)客戶傳入的標(biāo)識(shí)
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側(cè)OC代碼示例

// appid,channelid,userid,nonce,timestamp,token必須和服務(wù)器計(jì)算的一致
// username是方便排查問題時(shí)客戶傳入的標(biāo)識(shí)
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];

直播連麥

  • 直播連麥,主播與觀眾連麥或主播PK的推拉流地址:

    連麥/主播PK場(chǎng)景推流地址:

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

    連麥/主播PK場(chǎng)景拉流地址:

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

    live.aliyun.com是直播連麥URL固定前綴,不是一個(gè)真實(shí)的域名,不可對(duì)其進(jìn)行域名的相關(guān)操作(比如ping,traceroute,telent等)。