场景简介

辅助认证多选一是辅助认证的扩展场景,管理员可以在控制台配置多个辅助认证,用户根据自身情况选择合适的辅助认证进行认证,使得用户有更加灵活的方式进行认证,同时也可以轻松处理有国内和国际短信网关的场景,有需求时参考MainApp中的SecondAuthViewController实现。

前置步骤

在实际集成之前,我们要确保已经进行过开发准备

流程图

流程图

集成步骤

1、实现用户名密码主认证

参考典型场景用户名密码认证

2、处理二次认证-辅助认证多选一

doSecondaryAuth接口详情

如果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、重新获取验证码

regetSmsCode接口详情

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

示例代码如下:

SFUemSDK.getInstance().getSFAuth().regetSmsCode(SecondAuthActivity.this);

多选一场景下,新增接口regetSmsCodeWidthAuthId,需要传递authId参数 示例代码如下:

 /**
  * 短信验证码过期后,需要调用重新获取短信验证码
  * 辅助认证多选一的场景下,需要传入辅助认证的authId
  */
SFUemSDK.getInstance().getSFAuth().regetSmsCodeWidthAuthId(authId, SecondAuthActivity.this);

results matching ""

    No results matching ""