场景简介
图形验证码认证是最基本的辅助认证方式之一,目前SDK提供两种接入该功能的方式:
- 第一种:SDK有内置的图形验证码UI,可以直接使用(默认配置)。
- 第二种:UI有自己的需求,需要自己实现UI,需先设置配置开关,代码参考SDKDemo中的SecondAuthActivity开关实现以及SecondAuthActivity中的RandCodeSdpDialog弹窗实现。
前置步骤
流程图
集成步骤
第一种集成方式:使用SDK内部UI支持图形验证码 (无需设置,SDK默认使用内部UI支持图形验证码)
注意 如果使用SDK内部UI支持图形验证码,无需修改代码,默认使用SDK内部UI,注意如下:
- 因为当前SDK的全屏图形验证码dialog是绑定客户编码的登录界面Activity,故行为上与登录Activity界面保持一致
- 横竖屏切换,如果登录界面没有如下configChanges配置,可能在横竖屏切换的时候,图形验证码界面会dismiss掉(Activity重新走生命周期)
android:configChanges="orientation|keyboardHidden|screenSize"
- 使用SDK内部图形验证码,需要弹窗,依赖Activity,所以初始化SDK最晚需要在认证界面的onCreate回调中,晚于这个时候,会导致SDK无法获取到Activity,导致无法弹出图形验证码的弹框。
第二种集成方式:不使用SDK内部,自己定义UI处理
1、实现用户名密码主认证
参考典型场景用户名密码认证
2、处理二次认证-图形校验码认证(参考上面接口设置开关)
首先设置开关关闭,因为SDK默认开关打开
关闭设置,不使用SDK内部UI
//设置开发关闭,就是不使用SDK内部图形验证码码
SFUemSDK.getInstance().getSFConfig().setOptions(SFSDKOptions.OPTIONS_KEY_RAND_SDK,"0");
附:打开设置,使用SDK内部UI(默认配置)
//设置打开开关,就是使用SDK内部的图形验证码
SFUemSDK.getInstance().getSFConfig().setOptions(SFSDKOptions.OPTIONS_KEY_RAND_SDK,"1");
如果aTrust身份认证服务器有启用图形验证码认证时会进入当前流程,用户名密码认证通过后会执行onAuthProgress回调,并通过nextAuthType参数告知需要二次认证的类型为图形校验码认证。 当调用该回调时,会先传递需要校验的图片数据给上层用户,所以此时只需展示对应的图形校验码认证UI界面,通过UI收集到图形验证码,调用二次认证接口完成二次认证。
注意:如果管理员配置了除图形验证码以外的二次认证方式(如首次登陆强制修改密码),也会进入到此回调中,此时如果确认不需要支持此二次认证,建议提示用户不支持此认证,让管理员调整配置
示例代码如下:
/**
* 下一次认证类型
*/
private SFAuthType mNextAuthType;
/**
* 需要二次认证
*
* @param nextAuthType 下一步认证类型
* @param message 下一步认证信息
*/
@Override
public void onAuthProgress(SFAuthType nextAuthType, SFBaseMessage message) {
mNextAuthType = nextAuthType;
//判断当前的认证类型
if (nextAuthType == SFAuthType.AUTH_TYPE_RAND) {
// 处理图形认证的一些逻辑,如显示图形数据展示的dialog
// sdkdemo中提供了dialog参考:RandCodeSdpDialog.java
} else {
/**
* 服务端配置了首次登陆强制修改密码,或者其他非图形验证码二次认证类型时,认证时也会回调此方法,
* 此时如果不打算适配此类型二次认证,建议给用户提示,让管理员调整配置
*/
Toast.makeText(context, "暂不支持此种认证类型(" + nextAuthType.toString() + ")", Toast.LENGTH_LONG).show();
}
}
/**
* 使用图形点击的座标进行二次认证
*/
private void doSmsSecondAuth() {
Map<String, String> authParams = new HashMap<String, String>();
String randCode = "xxxx"; // 图形验证码
authParams.put(SFConstants.AUTH_KEY_RANDCODE, randCode);
/**
* 图形校验码二次认证
* @param authType
* mNextAuthType = SFAuthType.AUTH_TYPE_RAND
* @param authInfo
* authParams.put(SFConstants.AUTH_KEY_RANDCODE, "图形验证码value");
* @return
*/
SFUemSDK.getInstance().doSecondaryAuth(mNextAuthType, authParams);
}
3、认证成功
主认证和二次认证都成功后,会执行onAuthSuccess回调,至此整个认证流程就结束了,认证成功后,应用就可以正常的访问aTrust管理员配置的内网服务器资源, 执行业务代码
示例代码如下:
/**
* 认证成功
*
* @param message 认证成功message
*/
@Override
public void onAuthSuccess(SFBaseMessage message) {
SFLogN.info(TAG, "认证成功!");
// 认证成功之后的业务
}
4、认证失败
如果有认证失败的情况,会执行onAuthFailed回调, 在该回调中提示用户,重新开始认证
示例代码如下:
/**
* 认证失败
*
* @param message 认证失败message
*/
@Override
public void onAuthFailed(SFBaseMessage message) {
SFLogN.info(TAG, "认证失败!" + message.mErrStr);
// 重新开始认证或者其他逻辑
}
5、重新获取图形验证码
示例代码如下:
SFUemSDK.getInstance().getSFAuth().regetRandCode(new SFRegetRandCodeListener() {
@Override
public void onRegetRandCode(boolean success, byte[] bytes, int byteLength) {
//bytes图片数据
if (success) {
SFLogN.info(TAG, "获取图形验证码数据成功");
}
}
});