生成 Token

Token 是用户的凭证,由 AppID、秘钥(Appsecret)、用户ID 生成。Token 鉴权比 AppID 鉴权更复杂更安全,适用于安全性要求高的场景,例如登录音视频服务。

Token分为临时Token和正式Token。临时Token由控制台提供,适用于项目测试阶段鉴权。正式Token需业务按照既定规则自行生成,应用于正式生产环境中。

生成临时Token

前提条件

创建项目(鉴权模式为 Token模式)并获取用户ID。

操作步骤

  1. 登录控制台 ,选择 项目管理
  2. 在项目列表中,点击鉴权图标并选择 临时Token
  3. 输入用户ID,点击 生成Token

生成正式Token

正式由 AppID、秘钥(Appsecret)、用户ID 按照既定规则生成。

前提条件

创建项目(鉴权模式为Token模式)并获取用户ID。

操作步骤

  1. 登录控制台 ,选择 项目管理
  2. 在项目列表点击修改图标,获取AppID、 秘钥。
  3. 按照示例代码规则生成正式Token,详见 Token生成示例

Token生成示例

支持使用 Java、Python、 Go、PHP、Ruby等语言在服务端生成 Token,以下以 Java、Python、 Go为例,更多示例请联系您的技术支持人员。

Golang示例
  • 生成Token

        appid:=int32(12345)
    	uid:="1234444"
    	expiresecs:=int32(46)
    	tk:=sctoken.NewSCToken(appid,uid,expiresecs)
    	// 设置业务参数
    	tk.SetParameter("pkey1","pval1")
    	tk.SetParameter("pkey2","pval2")
    	// 设置业务权限
    	tk.SetPrivilege("pri1",300)
    	tk.SetPrivilege("pri2",400)
    	// 生成token 串
    	token:=tk.BuildToken("appkey1234")

  • 验证Token

        // 解析token串,生成SCToken对象
    	tk,err:=sctoken.ParseToken(token,"appkey1234")
    	if err!=nil {
    		// print err
    	} else {
    		   if tk.IsValid(){
    			    // token 有效
    				// do something
        } else {
    				// token 已过期
    			}
    	    }

Python示例
  • 生成Token

        app_id = 1296325
        app_secret = bytearray(b'abcdefg')
        uid = "987654321"
        valid_time = 100
        build_timestamp = int(time.time() * 1000)
        // 设置业务参数
        parameter = {"pkey1": "pval1", "pkey2": "pval2"}
        // 设置业务权限
        privileges = {"pri1": 300, "pri2": 400}
        // 生成token 串
        token_str = SCToken().gen(app_id, app_secret, uid, parameter, privileges, build_timestamp, valid_time)

  • 验证Token

        // 解析token串,生成SCToken对象
        app_secret = bytearray(b'abcdefg')
        token_str = "_2dllwAAAHMAADA5AAk5ODc2NTQzMjEAAgAFcGtleTIABXB2YWwyAAVwa2V5MQAFcHZhbDEAAgAEcHJpMQAAAAAAAAEsAARwcmkyAAAAAAAAAZAAAAFsuAVsTAAA6mDjTWxNCdjou_5GSCFCWLtGAgn9Ww"  
        yt, err = SCToken().parse(token_str, app_secret) 
        if err != None:
            // print "token 解析失败"
        else:
            if yt.validate():
                // print "token 有效"
                // do something
            else:
                //print "token 过期"

Java示例
  • 生成Token

        private static void genToken()
        throws UnsupportedEncodingException {
        /*
         * Initialize tokenBuilder, passing your appKey which can be found on developer center
         */
        SCTokenBuilder builder = new SCTokenBuilder( new SCTokenAppSecretProvider() {
            @Override
            public String getAppsecret( int appKey ) {
                // app secret
                return "1234";
            }
        } );
        /*
         * Parameter:
         *
         * version: token Version, integer
         *
         * appid: appKey, integer
         *
         * uid, business definition, string
         *
         * validTime, in seconds, value less then 90 will be set to TOKEN_MIN_VALID_TIME(90s)
         *
         */
        SCTokenPropertyProvider provider = new SCTokenPropertyProvider(2, 1234, "2483549835", 4*60*60);
        // Optional Extend parameters,defined by your app
        provider.getParameterProperties()
                //
                .addTokenExtendProperty("param1","content")
                //
                .addTokenExtendProperty("param2",2);
        // Optional privilege properties,defined by your app
        provider.getPrivilegeProperties()
                //
        .addTokenExtendProperty("privilege1",12345566l)
                //
        .addTokenExtendProperty("privilege2",12345566l);
        //Generate token according to above attribute configuration
        byte[] token = builder.buildBinanyToken( provider ); 
        // In order to facilitate network transmission,
        // BASE 64 encoding and url_safe mode are used
        Base64 coder = new Base64( 76, new byte[] {}, true );  
        // The byte array is converted to a string to print
        String tokenStr = coder.encodeAsString( token );
        System.out.println( "gen token:"+ tokenStr );
    }    

  • 验证Token

        private static void validToken(String tokenStr) throws UnsupportedEncodingException {
        /*
         * Initialize tokenBuilder, passing your appKey which can be found on develop center
         */
        SCTokenBuilder builder = new SCTokenBuilder( new SCTokenAppSecretProvider() {
            @Override
            public String getAppsecret( int appKey ) {
                // app secret
                return "1234";
            }
        } );
        Base64 coder = new Base64( 76, new byte[] {}, true );   
        // parse token,make sure your token is url-safed, mean that '+' and '/' MUST NOT be found in your token
        if (!tokenStr.equals(URLDecoder.decode(tokenStr, "UTF-8"))) {
            throw new SCTokenException("token isn't url-safed");
        }
        byte[] token = coder.decode(tokenStr.getBytes( "UTF-8" ) );
        SCToken scToken = builder.validateTokenBytes( token );
        System.out.println( "decode token: " + scToken.toString());
    }

下载示例代码

语言示例代码
Golang点击下载
Java点击下载
Python点击下载 V2.7
点击下载 V3.0

格式说明

image

字段名称类型说明
tokenVersionint32Token版本
tokenLenint32整个Token的字节长度,包括tokenLen 字段和 DigitalSignature 字段
App IDint32项目ID
uidLenint16用户ID的长度
uidString在项目内唯一的用户ID
parameterLenint16权限参数键值对的个数,下面的key/value可以有多个
key长度int16key的字节长度
keyStringkey的内容
value长度int16value的字节长度
valueStringvalue的内容
privilegesint16各项权限的键值对个数
key长度int16key的字节长度
keyStringkey的内容
valueint64value的字节内容
buildTimestampMillsint64生成Token的UTC时间(1970年以来),单位:毫秒
validTimeint32Token 的有效时长,单位:秒
DigitalSignature/数字签名,20 字节

说明:

  • 多字节整数使用网络字节序,即大端。
  • Token的过期时间 = Timestamp + validTime * 1000, UTC时间(1970年以来),单位:毫秒。
  • 数字签名:采用hmac-sha1算法对 DigitalSignature 字段前的所有数据运算生成,运算所需key为App 秘钥,App 秘钥可以从 个人中心/项目管理 页面获取。
  • 因为Token要通过http传递,所以需对整个Token进行url安全的base64编码,注意不是对整个base64进行url encode。

文档是否有解决您的问题?

有帮助 没帮助
提交成功,非常感谢您的反馈!

反馈

TOP