Token 鉴权
更新时间: 2022/10/13 18:28:20
网易云信音视频通话和互动直播产品中,鉴权方式分为安全模式和调试模式。如果您在控制台中为指定应用开启了安全模式,则对应应用的用户在加入房间时,需要通过 Token 进行身份校验。
本文档为您介绍鉴权方式和 Token 的生成方式。
鉴权方式
鉴权方式说明
鉴权方式分为安全模式和调试模式,其区别如下:
安全模式 | 调试模式 | |
---|---|---|
鉴权方式 | 默认开启。加入房间时,必须设置正确、可用的 Token,以便网易云信服务器对登录用户进行身份和权限认证。安全性较高。 | 加入房间时,无需设置 Token,即不对登录用户进行鉴权。安全性较低,可能会有盗刷风险。 |
应用场景 | 适用于正式上线的应用。 | 适用于调试、测试阶段的应用。 |
修改鉴权方式
创建应用并开通音视频通话或互动直播服务后,应用默认的鉴权方式为安全模式。网易云信建议您在应用接入和测试期间使用调试模式,并在正式上线前改为安全模式。
操作步骤如下:
- 登录网易云信控制台。
- 在左侧导航栏单击指定应用名称。
- 在已开通功能区域中,音视频通话 2.0或互动直播 2.0右侧单击功能配置。
- 在鉴权方式区域中,选择授权方式,并单击确定。
- 在弹出对话框中单击确定。
获取 Token
安全模式下,需要使用 NERTC Token 才能加入房间。其中您可以通过以下两种方式获取 NERTC Token:
方式一 向云信服务器申请 NERTC Token
基本流程如下:
-
客户端向应用服务器发起安全认证签名的请求。
该步骤交互由您自行完成。
-
应用服务器调用接口 getToken,向云信服务器申请 NERTC Token。
请求成功,云信服务器会将 NERTC Token 返回给应用服务器。
-
应用服务器将获取到的 NERTC Token 返回给客户端。
-
客户端通过以上步骤获取 NERTC Token 之后,可以携带 NERTC Token 加入房间。
方式二 在您的业务服务器根据规则自行计算 NERtc Token
基本流程如下:
-
客户端向应用服务器发起安全认证签名的请求。 该步骤交互由您自行完成。
-
应用服务器根据规则自行计算出 NERtc Token 并返回给客户端。 该步骤交互由您自行完成。
请基于 App Key、App Secret 和 uid,参考如下示例生成 NERtc Token。//获取当前时间戳,单位为毫秒 curTime = 1614764611561 //设置过期时间,单位为秒 ttl = 600 //生成 signature,将 appkey、uid、curTime、ttl、appsecret 五个字段拼成一个字符串,进行 sha1 编码 //其中 channelName 可以为空, 表示该 uid 可以使用这个 token 加入任意房间 signature = sha1(appkey + uid + curTime + ttl + channelName + appsecret) //组装成 json json = {"signature": "xx", "curTime":1614764611561, "ttl": 600} //将 json 转成字符串后进行 base64 编码,生成最终的 token String token = JSONUtil.toJsonStr(json) token = Base64.getEncoder().encodeToString(token.getBytes(StandardCharsets.UTF_8))
- App Key 与 App Secret 的获取方式:登录网易云信控制台 > 选择指定应用 > App Key管理。
- uid 为用户在您应用中的 ID,请在您的业务服务器上自行管理并维护。
-
客户端通过以上步骤获取 NERTC Token 之后,可以携带 NERTC Token 加入房间。
API 参考
- 请求 Header 的相关说明(包括 CurTime、CheckSum)请参考服务端 API 请求结构。
- 请注意此接口的 Content-Type 与其他音视频服务端接口有所差异,为
application/x-www-form-urlencoded;charset=utf-8
。
接口地址信息
POST https://api.netease.im/nimserver/user/getToken.action HTTP/1.1
Content-Type:application/x-www-form-urlencoded;charset=utf-8
请求参数
参数名称 | 类型 | 是否必选 | 示例值 | 描述 |
---|---|---|---|---|
uid | Long | 必选 | 123456 | 用户 ID。 |
channelName | String | 可选 | abc | 绑定的房间名称。未指定 channelName 时,获取的 Token 可以用于加入任何房间。 |
repeatUse | Boolean | 可选 | true | 在 Token 有效期内该用户是否可以多次使用该 Token,默认为 true。
|
expireAt | int | 可选 | 640 | NERTC Token 的过期时间,过期后,该用户将无法通过此 Token 加入房间。 取值范围为 1~86400 秒,默认为 600 秒。 |
如果需要更新 NERTC Token 有效期,可以在该 Token 过期之前,重复使用同样的 uid 和 channelName 再次调用该接口,通过 expireAt 参数修改 Token 有效期。服务端不会返回新的 Token,但会更新此 Token 的有效期。
请求示例
curl请求示例如下:
curl -X POST -H "AppKey: go9dnk********" -H "Nonce: 4tggger********" -H "CurTime: 1443592222" -H "CheckSum: 9e9db3b6c9ab********************" -H "Content-Type: application/x-www-form-urlencoded" -d 'uid=123456' 'https://api.netease.im/nimserver/user/getToken.action'
HttpClient 请求示例如下,此处以 JAVA 为例。
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception{
DefaultHttpClient httpClient = new DefaultHttpClient();
String url = "https://api.netease.im/nimserver/user/getToken.action";
HttpPost httpPost = new HttpPost(url);
String appKey = "94kid09c9ig9k1loimjg012345123456";
String appSecret = "123456789012";
String nonce = "12345";
String curTime = String.valueOf((new Date()).getTime() / 1000L);
String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime);///checkSum的计算方式请参考《服务端API-服务端API说明-调用方式》
// 设置请求的header
httpPost.addHeader("AppKey", appKey);
httpPost.addHeader("Nonce", nonce);
httpPost.addHeader("CurTime", curTime);
httpPost.addHeader("CheckSum", checkSum);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// 设置请求的参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("uid", "123456"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
// 执行请求
HttpResponse response = httpClient.execute(httpPost);
// 打印执行结果
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
}
返回参数
参数名称 | 类型 | 示例值 | 描述 |
---|---|---|---|
code | Number | 200 | 状态码。200 表示成功调用。 |
token | String | xxxxx | 服务端返回的 Token。 |
返回示例
JSON格式的返回示例如下:
"Content-Type": "application/json; charset=utf-8"
{
"code":200,
"token":"xxxxx" //安全认证模式下的签名。
}