94 lines
3.3 KiB
Objective-C
94 lines
3.3 KiB
Objective-C
//
|
|
// TokenGenerator.m
|
|
// SellyCloudSDK_Example
|
|
//
|
|
// Created by Caleb on 20/11/25.
|
|
// Copyright © 2025 Caleb. All rights reserved.
|
|
//
|
|
|
|
#import "TokenGenerator.h"
|
|
|
|
#define KSecret @"CHANGE_ME"
|
|
#define CALL_APP_ID @"demo-app"
|
|
|
|
@implementation TokenGenerator
|
|
|
|
+ (NSString *)generateRTCCallTokenWithUserId:(NSString *)userId
|
|
callId:(NSString *)callId
|
|
{
|
|
// 当前时间戳(秒)
|
|
long signTime = (long)[[NSDate date] timeIntervalSince1970];
|
|
long exprTime = signTime + 600; // 10 分钟后过期
|
|
|
|
// payload 拼接
|
|
NSString *payload = [NSString stringWithFormat:@"%@%@%@%ld%ld",
|
|
CALL_APP_ID, userId, callId, signTime, exprTime];
|
|
|
|
// HMAC-SHA256 计算
|
|
const char *cKey = [KSecret cStringUsingEncoding:NSUTF8StringEncoding];
|
|
const char *cData = [payload cStringUsingEncoding:NSUTF8StringEncoding];
|
|
|
|
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
|
|
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
|
|
|
|
// 转 hex 字符串
|
|
NSMutableString *sign = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
|
|
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
|
|
[sign appendFormat:@"%02x", cHMAC[i]];
|
|
}
|
|
|
|
// 拼接最终 Token
|
|
NSString *token = [NSString stringWithFormat:
|
|
@"appid=%@&userid=%@&callid=%@&signtime=%ld&exprtime=%ld&sign=%@",
|
|
CALL_APP_ID, userId, callId, signTime, exprTime, sign];
|
|
|
|
return token;
|
|
}
|
|
|
|
+ (NSString *)generateStreamSignatureWithVhost:(NSString *)vhost
|
|
appId:(NSString *)appId
|
|
channelId:(NSString *)channelId
|
|
type:(NSString *)type
|
|
key:(NSString *)key
|
|
{
|
|
// 当前时间戳(秒)
|
|
long signTm = (long)[[NSDate date] timeIntervalSince1970];
|
|
long expireTm = signTm + 600; // 10 分钟后过期
|
|
|
|
// 拼接签名字符串: vhost|app_id|channel_id|sign_tm|expire_tm|type
|
|
NSString *payload = [NSString stringWithFormat:@"%@|%@|%@|%ld|%ld|%@",
|
|
vhost, appId, channelId, signTm, expireTm, type];
|
|
|
|
// 使用 key 生成签名
|
|
NSString *sign = [self generateSign:payload withKey:key];
|
|
|
|
// 拼接完整 payload: vhost|app_id|channel_id|sign_tm|expire_tm|type|sign
|
|
NSString *fullPayload = [NSString stringWithFormat:@"%@|%@", payload, sign];
|
|
NSLog(@"###fullPayload == %@",fullPayload);
|
|
|
|
// Base64 编码
|
|
NSData *data = [fullPayload dataUsingEncoding:NSUTF8StringEncoding];
|
|
NSString *base64String = [data base64EncodedStringWithOptions:0];
|
|
|
|
return base64String;
|
|
}
|
|
|
|
+ (NSString *)generateSign:(NSString *)payload withKey:(NSString *)key {
|
|
// HMAC-SHA256 计算
|
|
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
|
|
const char *cData = [payload cStringUsingEncoding:NSUTF8StringEncoding];
|
|
|
|
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
|
|
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
|
|
|
|
// 转 hex 字符串
|
|
NSMutableString *sign = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
|
|
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
|
|
[sign appendFormat:@"%02x", cHMAC[i]];
|
|
}
|
|
|
|
return sign;
|
|
}
|
|
|
|
@end
|