场景简介

短信主认证是最基本的主认证方式之一,跟用户名密码认证类似,只是在传递认证参数上有点区别。

前置步骤

  1. 在实际集成之前,我们要确保已经进行过开发准备
  2. 在控制台创建测试用户,并配置好短信主认证,参考产品手册

流程图

流程图

集成步骤

1、初始化SDK

initSDK接口详情

注意:SDK接口都需要在SDK初始化后才能调用,否则会抛出异常。

初始化SDK主要是完成SDK核心功能配置的初始化,放到Application的attachBaseContext中初始化。

示例代码如下:

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    initSDK(base);
}

/**
 * 初始化SangforSDK
 *
 * @param context
 */
private void initSDK(Context context) {
    Map<SFSDKExtras, String> extra = new HashMap<>();

    int sdkFlags = SFSDKFlags.FLAGS_HOST_APPLICATION;
    sdkFlags |= SFSDKFlags.FLAGS_VPN_MODE_TCP;

    SFUemSDK.getInstance().initSDK(context, SFSDKMode.MODE_VPN_SANDBOX, sdkFlags, extra);
}

注意

SFSDKMode.MODE_VPN_SANDBOX: 该模式是启用vpn代理功能,和启用终端安全沙箱功能(水印,分享隔离,剪切板隔离等等安全功能); 只有当集成SDK的APP在应用中心授权给用户, 用户才可以使用集成SDK的APP接入使用, 并且占用并发授权和UEM移动版授权;

SFSDKMode.MODE_VPN: 该模式表示只是启用vpn代理功能,不启用终端安全沙箱功能(水印,分享隔离,剪切板隔等等安全功能); 无论集成SDK的APP是否在应用中心授权给用户, 用户都可以使用集成SDK的APP接入使用, 并且仅占用并发授权;

沙箱文件加密功能说明:

沙箱功能中的文件加密功能是指,如果终端(手机)开启文件加密,app中需要落盘的数据会自动被加密然后重定向,以保证数据在手机存储里面的安全;

集成步骤上只需要在上面初始化的时候增加flag:SFSDKFlags.FLAGS_ENABLE_FILE_ISOLATION 并设置SDKMode为SFSDKMode.MODE_VPN_SANDBOX

示例代码如下:

/**
 * 初始化SangforSDK
 *
 * @param context
 */
private void initSDK(Context context) {
    Map<SFSDKExtras, String> extra = new HashMap<>();

    int sdkFlags = SFSDKFlags.FLAGS_HOST_APPLICATION;
    sdkFlags |= SFSDKFlags.FLAGS_VPN_MODE_TCP;
    //开启文件加密功能
    sdkFlags |= SFSDKFlags.FLAGS_ENABLE_FILE_ISOLATION;

    SFUemSDK.getInstance().initSDK(context, SFSDKMode.MODE_VPN_SANDBOX, sdkFlags, extra);
}

2、设置认证回调

setAuthResultListener接口详情

aTrust身份认证属于通过网络耗时操作,SDK实现时是通过代理异步回调来获取认证结果。请务必在使用认证接口前,按要求实现并注册认证结果回调。

示例代码如下:

public class PrimaryAuthActivity extends AppCompatActivity implements SFAuthResultListener, View.OnClickListener {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_psw);

         /**
         * 设置认证回调,认证结果在SFAuthResultListener的onAuthSuccess、onAuthFailed、onAuthProgress中返回
         * 如果不设置,将接收不到认证结果回调
         */
        SFUemSDK.getInstance().setAuthResultListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        //只有走回收流程的时候的那种onPause,isFinishing才为true
        if (isFinishing()) {
            //取消认证回调
            SFLogN.info(TAG,"SFUemSDK setAuthResultListener null");
            /**
             * 注意: 清除回调建议放到onPause()方法而不是onDestroy()中,
             * 避免出现onDestroy()在onCreate()之后执行,onCreate注册的认证回调被onDestory清空的问题
             */
            SFUemSDK.getInstance().setAuthResultListener(null);
        }
    }
}

3、短信主认证

startPrimarySmsAuth接口详情

示例代码如下:


String url = "";
String phoneNumber = "";
/**
* 开始短信主认证,认证结果会在认证回调onAuthSuccess,onAuthFailed,onAuthProgress中返回
* @param url 请求认证的服务器地址信息
* @param phoneNumber 手机号码:86-xxxxxxxxxxx@认证域
*/
SFUemSDK.getInstance().startPrimarySmsAuth(url,phoneNumber);

4、处理短信发送

doSecondaryAuth接口详情

调用startPrimarySmsAuth认证通过后会执行onAuthProgress回调,并通过nextAuthType参数告知需要认证的类型为短信主认证。当调用该回调时,会先发送短信到用户手机上,所以此时只需展示对应的短信认证UI界面,通过UI收集到短信验证码,调用doSecondaryAuth接口完成短信主认证。

示例代码如下:


    /**
     * 认证类型
     */
    private SFAuthType mNextAuthType;


    /**
     * 需要二次认证
     *
     * @param nextAuthType 认证类型
     * @param message      认证信息
     */
    @Override
    public void onAuthProgress(SFAuthType nextAuthType, SFBaseMessage message) {

        mNextAuthType = nextAuthType;

        if (nextAuthType == SFAuthType.AUTH_TYPE_PRIMARY_SMS) {
            // 处理短信主认证的一些逻辑,如显示验证码输入框
        } else {
              /**
                * 服务端配置了首次登陆强制修改密码,或者其他非短信验证码二次认证类型时,认证时也会回调此方法,
                * 此时如果不打算适配此类型二次认证,建议给用户提示,让管理员调整配置
                */
                Toast.makeText(context, "暂不支持此种认证类型(" + nextAuthType.toString() + ")", Toast.LENGTH_LONG).show();
        }
    }

    /**
     * 使用短信主认证
     */
    private void doSmsSecondAuth() {
        Map<String, String> authParams = new HashMap<String, String>();

        String smsCode = "xxxx"; // 短信验证码

        authParams.put(SFConstants.AUTH_KEY_PRIMARYSMS_CODE, smsCode);

        SFUemSDK.getInstance().doSecondaryAuth(mNextAuthType, authParams);

    }

5、认证成功

主认证成功后,如果管理员未配置二次认证,就会执行onAuthSuccess回调,至此整个认证流程就结束了,认证成功后,应用就可以正常的访问aTrust管理员配置的内网服务器资源, 执行业务代码

示例代码如下:

     /**
     * 认证成功
     *
     * @param message 认证成功message
     */
    @Override
    public void onAuthSuccess(SFBaseMessage message) {
        SFLogN.info(TAG, "认证成功!");
         // 认证成功之后的业务
    }

6、认证失败

如果有认证失败的情况,会执行onAuthFailed回调, 在该回调中提示用户,重新开始认证

示例代码如下:

    /**
     * 认证失败
     *
     * @param message 认证失败message
     */
    @Override
    public void onAuthFailed(SFBaseMessage message) {
        SFLogN.info(TAG, "认证失败!" + message.mErrStr);
        // 重新开始认证或者其他逻辑
    }

7、重新获取验证码

regetSmsCode接口详情

短信验证码有效期可以通过onAuthProgress中的参数message(参考SFSmsMessage)来获取,短信验证码失效后,可以调用接口重新获取

示例代码如下:

SFUemSDK.getInstance().getSFAuth().regetSmsCode(new SFRegetSmsListener() {
    @Override
    public void onRegetSmsCode(boolean success, SFSmsMessage message) {
        if (success) {
            SFLogN.info(TAG, "获取短信验证码成功");
        }
    }
});

8、监听注销回调

registerLogoutListener接口详情

sdk使用过程中有可能出现被注销的情况,如应用主动调用注销接口、服务端管理员主动让用户下线等,所以应用监听注销回调是必须的,避免出现sdk内部已经注销了,但是应用无感知,从而出现业务异常的问题; 注意:注销回调建议在应用全生命周期内进行监听,避免出现在某个页面监听,页面销毁后,注销事件丢失的问题,可以参考SDKDemo的处理方法:在sdk初始化后就用一个单例对象注册注销回调

示例代码如下:

/**
* 注销事件监听回调,推荐在Application里面监听, 避免出现认证开始了还未监听的问题
*/
SFUemSDK.getInstance().registerLogoutListener(new SFLogoutListener() {
    @Override
    public void onLogout(SFLogoutType type, SFBaseMessage message) {
        SFLogN.info(TAG, "onLogout, message: " + message);
        /**
        * 收到注销事件,需要重新认证
        */
    }
});

9、免密认证

startAutoTicket接口详情

sdk提供了免密认证的能力,即认证流程全部通过后,重启应用后,应用不需要再次使用用户名密码进行认证,可以直接调用免密认证接口进行认证上线

注意:

  1. 免密认证接口只需要在应用进程启动后调用一次,不用多次调用
  2. 免密认证不能完全取代主认证,因为用户主动注销或者管理员在控制台主动让用户下线等场景下,免密信息会失效,免密认证就会失败,所以应用需要在免密认证失败后,继续使用用户名密码进行认证,可以参考SDKDemo中的处理方式

示例代码如下:

/**
* 这里是自动免密认证接口,返回true表示认证成功,此时用户就可以进行资源访问了,
* 如果返回false,表示当前不满足自动免密条件,需要用户主动调用用户名密码认证接口
*/
if (SFUemSDK.getInstance().startAutoTicket()){
    showToast("免密成功");
} else {
    //继续用户名密码认证逻辑
}

results matching ""

    No results matching ""