Skip to content

安全接入——客户端

Kevin edited this page Dec 27, 2017 · 6 revisions

在此之前,请确保已经阅读过如何快速接入TENCENT SOTER。同时,为了帮助你更好理解如何实现在客户端的安全接入,建议阅读本章节的同学参考Sample的实现。

什么是NetWrapper

NetWrapper是soter-wrapper为了将网络请求封装在流程中而提供的网络封装结构体。各个流程中,开发者只需要实现对应的NetWrapper,作为相应流程API参数,即可封装所有网络操作。 netwrapper 其基础接口定义为:

public interface ISoterNetBaseWrapper<W, T> {

    void setRequest(@NonNull W requestDataModel); // 从requestDataModel中获取网络上传参数

    void execute(); // 定义如何发送该网络请求

    void setCallback(ISoterNetCallback<T> callback); // 定义当网络回包时,需要提供的结果结构体

}

根据功能不同,可分为

  • IWrapGetSupportNet:定义了通过后台获取是否支持TENCENT SOTER的后台请求
  • IWrapUploadKeyNet:定义了上传ASK、AuthKey的后台请求
  • IWrapGetChallengeStr:定义了获取挑战因子的后台请求
  • IWrapUploadSignature:定义了上传最终签名授权串的后台请求

可以参考sample实现各个NetWrapper。

流程

安全接入流程相对于快速接入而言,接口调用顺序并无差异,唯一需要注意的是需要提供与后台交互所需的NetWrapper。

初始化

在初始化过程中,需要提供从后台获取本设备是否支持的NetWrapper。

InitializeParam param = new InitializeParam.InitializeParamBuilder()
                .setGetSupportNetWrapper(new IWrapGetSupportNet(){...}) // 从后台获取本设备是否支持的NetWrapper。
                .setScenes(ConstantsSoterDemo.SCENE_PAYMENT) // 自定义场景值,用于标识后续生成密钥和验签场景
                .build();
SoterWrapperApi.init(context, mGetIsSupportCallback, param);

准备密钥

在准备密钥过程中,需要提供上传ASK(应用密钥)的NetWrapper,以便后台处理所传数据并送往TAM验签;以及上传AuthKey(业务密钥)的NetWrapper,以便后台验签并存储(注:不再建议提前生成ASK,可能会拖慢启动。同时极少量机型有兼容性问题,提前生成ASK可能会导致不可预见错误。建议第一次使用相关业务时生成。)。 在准备ASK的过程中,既可以单独生成:

SoterWrapperApi.prepareAppSecureKey(new SoterProcessCallback<SoterProcessKeyPreparationResult>(){...}, // 生成结果回调
                false, // 已有ASK的话是否重新生成
                new IWrapUploadKeyNet(){...} // 上传ASK的NetWrapper
);

也可以在生成AuthKey的时候,提供上传AuthKey的NetWrapper

SoterWrapperApi.prepareAuthKey(new SoterProcessCallback<SoterProcessKeyPreparationResult>() {...}, // 生成结果回调
    false,  // 已有AuthKey的话是否重新生成
    true,   // 如果没有ASK,是否一并生成
    ConstantsSoterDemo.SCENE_PAYMENT, // 本次密钥生成所使用业务的场景值,需要在init时填入
    new IWrapUploadKeyNet(pwdDigest){...}, // 上传AuthKey的NetWrapper
    new IWrapUploadKeyNet()){...}; // 上传ASK的NetWrapper

认证

认证过程需要提供获取挑战因子(后台生成的字符串,用于最终签名填入)和上传认证结果的NetWrapper。

AuthenticationParam param = new AuthenticationParam.AuthenticationParamBuilder() // 通过Builder来构建认证请求
                .setScene(ConstantsSoterDemo.SCENE_PAYMENT) // 指定需要认证的场景。必须在init中初始化。必填
                .setContext(context) // 指定当前上下文。必填。
                .setFingerprintCanceller(canceller) // 指定当前用于控制指纹取消的控制器。当因为用户退出界面或者进行其他可能引起取消的操作时,需要开发者通过该控制器取消指纹授权。建议必填。
                .setIWrapGetChallengeStr(new IWrapGetSupportNet(){...}) // 用于获取挑战因子的网络封装结构体。如果在授权之前已经通过其他模块拿到后台挑战因子,则可以改为调用setPrefilledChallenge。如果两个方法都没有调用,则会引起错误。
//                .setPrefilledChallenge("prefilled challenge") // 如果之前已经通过其他方式获取了挑战因子,则设置此字段。如果设置了该字段,则忽略获取挑战因子网络封装结构体的设置。如果两个方法都没有调用,则会引起错误。
                .setIWrapUploadSignature(new IWrapUploadSignature(){...}) // 用于上传最终结果的网络封装结构体。该结构体一般来说不独立存在,而是集成在最终授权网络请求中,该请求实现相关接口即可。选填,如果没有填写该字段,则要求应用方自行上传该请求返回字段。
                .setSoterFingerprintStateCallback(new SoterFingerprintStateCallback() {...}).build();
        SoterWrapperApi.requestAuthorizeAndSign(processCallback, param);