Skip to content

SDKAuth

Franken Zeng edited this page Aug 17, 2017 · 15 revisions

SDK鉴权

使用KSYMediaEditorKit前,需要对SDK进去授权。授权未通过,会导致合成失败。

一. 鉴权类型

AuthInfoManager 单例完成了鉴权信息的初始化,该示例支持两种初始化方法。

如果两个初始化都调用了,优先使用离线鉴权信息进行SDK鉴权。

1.1 联网授权

    /**
     * set AuthInfoManager  initial information<br/>
     * get Authorization from AppServer, do not store AccessKey&SecretKey in app code.
     *
     * @param auth    Authorization
     * @param date    x-amz-date
     */
    public void setAuthInfo(String auth, String date);

联网鉴权依赖开发者基于自己的AccessKey和SecretKey,计算出鉴权串,计算过程在服务器端完成。

联网鉴权的优点:

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

联网鉴权的缺点:

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

1.2 离线鉴权

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

 /**
     * set token information for AuthInfoManager 
     * @param token
     */
    public void setAuthInfo(String token);

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

离线鉴权的优点:

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

离线鉴权的缺点:

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

二. 联网鉴权使用指南

2.1 成为开发者

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

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

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

2.2 产生SDK鉴权串

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

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

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

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

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

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

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

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

服务器代码逻辑说明:

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

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

2.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
2.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(getApplicationContext(), authInfo, date);
            //添加鉴权结果回调接口(不是必须)
            AuthInfoManager.getInstance().addAuthResultListener(mCheckAuthResultListener);
            //开始向KSYServer申请鉴权(不是必须,SDK内部在合成前也会检查鉴权),此处为异步任务
            AuthInfoManager.getInstance().checkAuth();
     }
     ......

2.4 问题定位

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

三. 离线鉴权使用指南

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

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

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

Clone this wiki locally