Skip to content

SDKAuth

zanxiaofei edited this page Dec 11, 2017 · 15 revisions

SDK鉴权

使用KSYMediaEditorKit前,需要对SDK进去授权。授权未通过,会导致多段导入、合成等功能无效。

SDK鉴权包含两种类型:

  • 联网鉴权(2.0.0及以上版本已废弃)
  • 离线鉴权

一. 鉴权类型介绍

1 联网授权(2.0.0及以上版本已废弃)

联网鉴权的优点:

  1. 快速,无需联系商务,自主注册开发者帐号即能获取到鉴权串计算依赖的信息;
  2. SDK可以免费、长期使用;

联网鉴权的缺点:

  1. 每次使用短视频接口都需要请求一次SDK的鉴权串,如果网络请求失败将导致短视频SDK功能不可用。
  2. 不能在无网情况下使用短视频SDK。
  3. 集成成本高,需要搭建server提供鉴权串计算接口;

1.1 联网鉴权步骤:

  1. App向AppServer请求鉴权信息
  2. AppServer根据开发者基于自己的AccessKey和SecretKey计算出健全串,返回给App侧
  3. App将服务端返回的"Authorization"、"x-amz-date"通过SDK接口setAuthInfo设置给SDK
  4. 调用SDK接口checkAuth触发鉴权

1.2 鉴权结果查询

  1. 在调用接口checkAuth触发鉴权前,可以通过接口addAuthResultListener设置AuthInfoManager.CheckAuthResultListener鉴权回调
  2. 在鉴权回调中通过接口getAuthState来获取鉴权结果

2 离线鉴权

离线鉴权输入的token是一个常量字符串,在APP代码里面写死即可一直使用。

v0.8.2版本后支持离线鉴权

离线鉴权v1.0版本签发的token可以在离线鉴权v2.0版本上运行,反过来,离线鉴权v2.0签发的token不能在离线鉴权v1.0版本上运行

离线鉴权v2.0以前的版本上在离线鉴权v2.1版本上不能使用,反过来,离线鉴权v2.1签发的token也不能在离线鉴权v2.0以前的版本上运行

离线鉴权的优点:

  1. 使用短视频SDK无需联网请求,短视频SDK功能不会出现不可用的情况;
  2. 手机无网情况下也能使用短视频SDK;
  3. 集成简单,不需要再搭建server计算;

离线鉴权的缺点:

  1. 未开发给普通开发者,需要通过金山云商务接入;
  2. 当前只开放给部分商务客户使用;

2.1 离线鉴权步骤:

  1. 向SDK设置鉴权token
  2. 通过接口checkAuth触发鉴权

2.2 鉴权结果查询

在触发鉴权后可直接通过接口getAuthState来获取鉴权结果

二、相关接口说明

  1. 联网鉴权设置鉴权信息接口
    /**
     * @param auth    Authorization
     * @param date    x-amz-date
     */
    public void setAuthInfo(String auth, String date);
  1. 离线鉴权设置鉴权信息接口
    public void setAuthInfo(String token);
  1. 触发鉴权
    public void checkAuth()
  1. 设置鉴权结果回调(联网鉴权异步使用)(v2.0.0版本中删除)
    //添加鉴权结果回调
    public void addAuthResultListener(CheckAuthResultListener resultListener)
    //AuthInfoManger为单例,若设置了回调,在窗口退出前或者回调结束后,必须将回调remove
    public void removeAllAuthListeners()
  1. 鉴权结果查询
    //返回鉴权成功还是失败  
    public boolean getAuthState()
    //获取鉴权过期时间,离线鉴权使用
    public String getAuthExpiredData()
    //获取完整的鉴权结果信息,包含鉴权状态,鉴权过期时间
    public AuthInfo getAuthInfo()

App侧相关示例代码参考ShortVideoActivity

三. 联网鉴权使用指南(v2.0.0版本中删除)

3.1 成为开发者

开发者使用KSYMediaEditorKit需要在金山云注册成为开发者,请在金山云官网开通帐号,获取开发者角色的ak/sk信息。

成为金山云的开发者,并不需要付费。如何获取ak/sk,请见ak/sk获取说明wiki

使用KSYMediaEditorKit短视频编辑SDK是免费的,可以免费集成至自己的商业产品中。

3.2 产生SDK鉴权串

APP尽量提前获取SDK鉴权串,以下两个时节可以向自己的APP Server请求SDK鉴权串(其他时机也可以):

  • APP初始化时,下发SDK鉴权串
  • 当用户跳转到短视频页面时,向APP Server请求SDK鉴权串

产生SDK鉴权串,需要开发者服务自己产生。产生逻辑和直播推流URL鉴权、播放URL鉴权逻辑类似(逻辑类似,实现场景可以参考)。

3.3 服务器生成鉴权串示例代码

计算SDK鉴权串,需要三个参数:

Android包名获取:getApplicationContext().getPackageName();

当前金山云提供了三个语言版本的服务器代码示例:

如果需要其他语言版本的代码示例,请开github issues

服务器代码逻辑说明:

  1. 读取开发者配置的ak/sk
  2. 读取服务器的x-amz-date
  3. 读取APP对应的包名(iOS 对应的是Bundle Identifier)
  4. 计算出Authorization
  5. 返回SDK鉴权串请求

包名可以出现在SDK鉴权串请求中,或者根据业务从服务器中初始化

3.3.1 鉴权服务返回

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"
  }
}

说明:

  1. DATA/RetCode/RetMsg 字段是业务层传输风格,不是必须项
  2. SDK鉴权初始化依赖Authorization、x-amz-date
3.3.2 客户端初始化
  • 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();
     }
     ......

3.4 问题定位

  1. 确保服务器代码中初始化的ak/sk来自于金山云控制台
  2. 确保计算的APP 包名对应了正确的APP

三. 离线鉴权使用指南

金山云商务提供集成短视频SDK的APP 包名,商务会提供永久离线鉴权通过的token。

将token以常量字符串方式存储于APP代码中,在初始化KSYMediaEditorKit传入即可。

每个token只对当前包名有效,其他人逆向拿到token也没有用处。可以直接存储于java代码中,也可以打包在资源文件中

Clone this wiki locally