-
Notifications
You must be signed in to change notification settings - Fork 53
SDKAuth
使用KSYMediaEditorKit前,需要对SDK进去授权。授权未通过,会导致多段导入、合成等功能无效。
SDK鉴权包含两种类型:
-
联网鉴权(2.0.0及以上版本已废弃) - 离线鉴权
联网鉴权的优点:
- 快速,无需联系商务,自主注册开发者帐号即能获取到鉴权串计算依赖的信息;
- SDK可以免费、长期使用;
联网鉴权的缺点:
- 每次使用短视频接口都需要请求一次SDK的鉴权串,如果网络请求失败将导致短视频SDK功能不可用。
- 不能在无网情况下使用短视频SDK。
- 集成成本高,需要搭建server提供鉴权串计算接口;
- App向AppServer请求鉴权信息
- AppServer根据开发者基于自己的AccessKey和SecretKey计算出健全串,返回给App侧
- App将服务端返回的"Authorization"、"x-amz-date"通过SDK接口setAuthInfo设置给SDK
- 调用SDK接口checkAuth触发鉴权
- 在调用接口checkAuth触发鉴权前,可以通过接口addAuthResultListener设置AuthInfoManager.CheckAuthResultListener鉴权回调
- 在鉴权回调中通过接口getAuthState来获取鉴权结果
离线鉴权输入的token是一个常量字符串,在APP代码里面写死即可一直使用。
v0.8.2版本后支持离线鉴权
离线鉴权v1.0版本签发的token可以在离线鉴权v2.0版本上运行,反过来,离线鉴权v2.0签发的token不能在离线鉴权v1.0版本上运行
- v2.0.0版本为离线鉴权v2.1版本
离线鉴权v2.0以前的版本上在离线鉴权v2.1版本上不能使用,反过来,离线鉴权v2.1签发的token也不能在离线鉴权v2.0以前的版本上运行
离线鉴权的优点:
- 使用短视频SDK无需联网请求,短视频SDK功能不会出现不可用的情况;
- 手机无网情况下也能使用短视频SDK;
- 集成简单,不需要再搭建server计算;
离线鉴权的缺点:
- 未开发给普通开发者,需要通过金山云商务接入;
- 当前只开放给部分商务客户使用;
- 向SDK设置鉴权token
- 通过接口checkAuth触发鉴权
在触发鉴权后可直接通过接口getAuthState来获取鉴权结果
- 联网鉴权设置鉴权信息接口
/**
* @param auth Authorization
* @param date x-amz-date
*/
public void setAuthInfo(String auth, String date);
- 离线鉴权设置鉴权信息接口
public void setAuthInfo(String token);
- 触发鉴权
public void checkAuth()
-
设置鉴权结果回调(联网鉴权异步使用)(v2.0.0版本中删除)
//添加鉴权结果回调
public void addAuthResultListener(CheckAuthResultListener resultListener)
//AuthInfoManger为单例,若设置了回调,在窗口退出前或者回调结束后,必须将回调remove
public void removeAllAuthListeners()
- 鉴权结果查询
//返回鉴权成功还是失败
public boolean getAuthState()
//获取鉴权过期时间,离线鉴权使用
public String getAuthExpiredData()
//获取完整的鉴权结果信息,包含鉴权状态,鉴权过期时间
public AuthInfo getAuthInfo()
App侧相关示例代码参考ShortVideoActivity
开发者使用KSYMediaEditorKit需要在金山云注册成为开发者,请在金山云官网开通帐号,获取开发者角色的ak/sk信息。
成为金山云的开发者,并不需要付费。如何获取ak/sk,请见ak/sk获取说明wiki。
使用KSYMediaEditorKit短视频编辑SDK是免费的,可以免费集成至自己的商业产品中。
APP尽量提前获取SDK鉴权串,以下两个时节可以向自己的APP Server请求SDK鉴权串(其他时机也可以):
- APP初始化时,下发SDK鉴权串
- 当用户跳转到短视频页面时,向APP Server请求SDK鉴权串
产生SDK鉴权串,需要开发者服务自己产生。产生逻辑和直播推流URL鉴权、播放URL鉴权逻辑类似(逻辑类似,实现场景可以参考)。
计算SDK鉴权串,需要三个参数:
- 开发者ak
- 开发者sk
- 集成KSYMediaEditorKit的APP包名
Android包名获取:getApplicationContext().getPackageName();
当前金山云提供了三个语言版本的服务器代码示例:
如果需要其他语言版本的代码示例,请开github issues
服务器代码逻辑说明:
- 读取开发者配置的ak/sk
- 读取服务器的x-amz-date
- 读取APP对应的包名(iOS 对应的是Bundle Identifier)
- 计算出Authorization
- 返回SDK鉴权串请求
包名可以出现在SDK鉴权串请求中,或者根据业务从服务器中初始化
KSYMediaEditorKit初始化SDK依赖的字段包括:
- Authorization
- x-amz-date
以下是SDK鉴权服务(需要开发者自己实现)的返回示例:
{
"Data": {
"Authorization": "AWS4-HMAC-SHA256 Credential=YOURAK/20170414/cn-beijing-6/ksvs/aws4_request, SignedHeaders=host;x-amz-date, Signature=742b927f176d43de5aada2f344d15cecfccacd73284151d6d1d5cfdaf9ac583f",
"RetCode": 0,
"RetMsg": "success",
"x-amz-date": "20170414T091747Z"
}
}
说明:
- DATA/RetCode/RetMsg 字段是业务层传输风格,不是必须项
- SDK鉴权初始化依赖Authorization、x-amz-date
- APP首先向自己的服务发起鉴权请求,获取到的HTTP response data
//开启异步任务,向AppServer请求鉴权信息, AUTH_SERVER_URI为你的AppServer地址
mAuthTask = new HttpRequestTask(mAuthResponse);
String url = AUTH_SERVER_URI + "?Pkg=" + getApplicationContext().getPackageName();
mAuthTask.execute(url);
- 从data中提取出Authorization、x-amz-date,分别赋值给ak和amzDate
- 将ak/amzDate 通过setAuthInfo初始化到AuthInfoManager中
- 通过checkAuth向KSYServer请求鉴权
......
//http 请求返回
JSONObject temp = new JSONObject(response);
JSONObject data = temp.getJSONObject("Data");
int result = data.getInt("RetCode");
if (result == 0) {
String authInfo = data.getString("Authorization");
String date = data.getString("x-amz-date");
//初始化鉴权信息
AuthInfoManager.getInstance().setAuthInfo(authInfo, date);
//添加鉴权结果回调接口(不是必须)
AuthInfoManager.getInstance().addAuthResultListener(mCheckAuthResultListener);
//开始向KSYServer申请鉴权(不是必须,SDK内部在合成前也会检查鉴权),此处为异步任务
AuthInfoManager.getInstance().checkAuth();
}
......
- 确保服务器代码中初始化的ak/sk来自于金山云控制台
- 确保计算的APP 包名对应了正确的APP
向金山云商务提供集成短视频SDK的APP 包名,商务会提供永久离线鉴权通过的token。
将token以常量字符串方式存储于APP代码中,在初始化KSYMediaEditorKit传入即可。
每个token只对当前包名有效,其他人逆向拿到token也没有用处。可以直接存储于java代码中,也可以打包在资源文件中