场景简介
辅助认证多选一是辅助认证的扩展场景,管理员可以在控制台配置多个辅助认证,用户根据自身情况选择合适的辅助认证进行认证,使得用户有更加灵活的方式进行认证,同时也可以轻松处理有国内和国际短信网关的场景,有需求时参考MainApp中的SecondAuthViewController实现。
前置步骤
在实际集成之前,我们要确保已经进行过开发准备
流程图
集成步骤
1、实现用户名密码主认证
参考典型场景用户名密码认证
2、处理二次认证-辅助认证多选一
如果aTrust身份认证服务器有启用短信认证时会进入当前流程,用户名密码认证通过后会执行onAuthProgress回调,并通过nextAuthType参数告知需要二次认证的类型为短信认证。 当调用该回调时,如果msg中nextServiceList数组中存在一个以上的对象,说明此时是辅助认证多选一的场景,所以此时需要创建辅助认证多选一的UI界面给用户进行选择,例如用户选择的是短信二次认证,则调用二次认证接口完成二次认证。
注意:如果管理员配置了除短信验证码以外的二次认证方式(如首次登陆强制修改密码),也会进入到此回调中,此时如果确认不需要支持此二次认证,建议提示用户不支持此认证,让管理员调整配置
示例代码如下:
/**
* 主认证成功,但需要辅助认证(下一步认证)
*
* @param nextAuthType 下一步认证类型
* @param message 下一步认证信息
*/
@Override
public void onAuthProgress(SFAuthType nextAuthType, SFBaseMessage message) {
SFLogN.info(TAG, "need next auth, authType: " + nextAuthType.name());
dismissWaitingDialog();
// 显示认证多选一
if (message.mNextServiceList != null && message.mNextServiceList.size() > 1) {
showSecondAuthMultiSelecAlert(nextAuthType, message);
return;
}
//显示下一步认证UI界面
showAuthDialog(nextAuthType, message, null);
}
/**
* 显示多选一认证
* @param authType
* @param message
*/
private void showSecondAuthMultiSelecAlert(final SFAuthType authType, final SFBaseMessage message) {
List<ServiceInfo> serviceInfoList = message.mNextServiceList;
AlertDialog.Builder mAuthMultiSelectBuilder = new AlertDialog.Builder(this);
mAuthMultiSelectBuilder.setTitle("其他二次认证方式");
List<String> authNames = new ArrayList<>();
for (ServiceInfo info: serviceInfoList) {
authNames.add(info.authName);
}
String[] authNamesArray = authNames.toArray(new String[0]);
mAuthMultiSelectBuilder.setItems(authNamesArray, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ServiceInfo selectedServiceInfo = serviceInfoList.get(which);
SFAuthType authType = SFAuthType.valueOf(selectedServiceInfo.authType);
switch (authType) {
case AUTH_TYPE_SMS: {
showAuthDialog(authType, message, selectedServiceInfo);
runOnUiThread(new Runnable() {
@Override
public void run() {
closeDialog();
//获取认证类型对应的layout布局
int viewLayoutId = SFDialogHelper.getAuthDialogViewId(authType);
String authId = selectedServiceInfo.authId;
String authname = selectedServiceInfo.authName;
// 处理短信认证
handlerOtherSecondAuth(authname, viewLayoutId, authType, message, authId);
}
});
break;
}
default:
showErrorMessage("暂不支持此种认证类型(" + authType.toString() + ")");
break;
}
}
});
mAuthMultiSelectBuilder.create().show();
}
如果是多选一认证方式,参数都需要携带authId, 例如短信认证:
// 多选一需要携带authId
if (!authId.isEmpty()) {
authParams.put(SFConstants.AUTH_KEY_ID, authId);
}
String errorMsg = buildAuthParams(authType, dialogView, authParams);
//检查参数构建是否成功
if (TextUtils.isEmpty(errorMsg)) {
showWaitingDialog(false);
//开始辅助认证
SFUemSDK.getInstance().doSecondaryAuth(authType, authParams);
} else {
//参数构建失败,进行提示
showErrorMessage(errorMsg);
}
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、重新获取验证码
短信验证码有效期可以通过onAuthProgress中的参数message(参考SFSmsMessage)来获取,短信验证码失效后,可以调用接口重新获取;
示例代码如下:
SFUemSDK.getInstance().getSFAuth().regetSmsCode(SecondAuthActivity.this);
多选一场景下,新增接口regetSmsCodeWidthAuthId,需要传递authId参数 示例代码如下:
/**
* 短信验证码过期后,需要调用重新获取短信验证码
* 辅助认证多选一的场景下,需要传入辅助认证的authId
*/
SFUemSDK.getInstance().getSFAuth().regetSmsCodeWidthAuthId(authId, SecondAuthActivity.this);