场景简介

图形验证码认证是最基本的辅助认证方式之一,目前SDK提供两种接入该功能的方式:

  1. 第一种:SDK有内置的图形验证码UI,可以直接使用(默认配置)。
  2. 第二种:UI有自己的需求,需要自己实现UI,需先设置配置开关,代码参考MainApp中的SecondAuthViewController开关实现以及SFRandCodeSdpViewController的实现。

前置步骤

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

流程图

流程图

集成步骤

第一种集成方式:使用SDK内部UI支持图形验证码 (无需设置,SDK默认使用内部UI支持图形验证码)

注意 如果使用SDK内部UI支持图形验证码,无需修改代码,默认使用SDK内部UI,注意如下:

  1. 因为当前SDK的全屏图形验证码界面为SFRandCodeSdpViewController控制器,是通过导航push进入,需要注意当前控制器是否支持这种方式
  2. 支持横竖屏切换,并且适配iPad

第二种集成方式:不使用SDK内部,自己定义UI处理

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

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

2、处理二次认证-图形校验码认证(参考上面接口设置开关)

首先设置开关关闭,因为SDK默认开关打开

关闭设置,不使用SDK内部UI

    // 设置开发关闭,就是不使用SDK内部图形验证码码
    [[SFUemSDK sharedInstance].config setOption:SFSDKOptionUsingSdkRandCodeUI value:@"0"];

附:打开设置,使用SDK内部UI(默认配置)

    // 设置打开开关,就是使用SDK内部的图形验证码
    [[SFUemSDK sharedInstance].config setOption:SFSDKOptionUsingSdkRandCodeUI value:@"1"];

doSecondaryAuth接口详情

如果aTrust身份认证服务器有启用图形验证码认证时会进入当前流程,用户名密码认证通过后会执行onAuthProgress回调,并通过nextAuthType参数告知需要二次认证的类型为图形校验码认证。 当调用该回调时,会先传递需要校验的图片数据给上层用户,所以此时只需展示对应的图形校验码认证UI界面,通过UI收集到图形验证码,调用二次认证接口完成二次认证。

注意:如果管理员配置了除图形验证码以外的二次认证方式(如首次登陆强制修改密码),也会进入到此回调中,此时如果确认不需要支持此二次认证,建议提示用户不支持此认证,让管理员调整配置

示例代码如下:


    /**
     * 主认证成功,但需要辅助认证(下一步认证)
     *
     * @param nextAuthType 下一步认证类型
     * @param msg  下一步认证信息
     */
    - (void)onAuthProcess:(SFAuthType)nextAuthType message:(BaseMessage *)msg {
        NSLog(@"SecondAuthViewController onAuthProcess:%ld, msg:%@", (long)nextAuthType, msg.errStr);
        [MBProgressHUD hideHUDForView:self.view animated:YES];

        switch (nextAuthType) {
            case SFAuthTypeRand:
                [self showRandCodeViewControllerWithRandCodeMessage:(SFRandCodeMessage *)msg];
                break;
            default:
                [AlertUtil showAlert:[NSString stringWithFormat:@"暂不支持此种认证类型(%ld)", nextAuthType] message:@"管理员请关掉此认证"];
                break;
        }
    }

    /**
     * 展示图形验证码界面
     *
     * @param msg 下一步认证信息
     */
    - (void)showRandCodeViewControllerWithRandCodeMessage:(SFRandCodeMessage *)msg {
        SFRandCodeSdpViewController *vc = [SFRandCodeSdpViewController randCodeSdpViewControllerWithImageData:msg.randcode];
        [self.navigationController pushViewController:vc animated:YES];
    }

    /**
     * 使用图形点击的座标进行二次认证
     */
    - (void)randCodeContentViewDidClickAllCoordinate:(NSArray *)coordinates {
        NSLog(@"%@", coordinates);
        NSMutableDictionary *randCodeDict = [NSMutableDictionary dictionary];
        [randCodeDict setValue:coordinates forKey:@"coordinates"];
        [randCodeDict setValue:@(self.randCodeContainerView.bounds.size.width) forKey:@"width"];
        [randCodeDict setValue:@(self.randCodeContainerView.bounds.size.height) forKey:@"height"];

        NSData *data = [NSJSONSerialization dataWithJSONObject:randCodeDict options:NSJSONWritingPrettyPrinted error:nil];
        NSString *randCodeDictStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        [self showLoading];
        [[SFUemSDK sharedInstance] doSecondaryAuth:SFAuthTypeRand data:@{kAuthKeyRandCode : randCodeDictStr}];
    }

3、认证成功

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

示例代码如下:

    /**
    * 认证成功的回调
    * @param msg 认证成功的信息
    */
    - (void)onAuthSuccess:(BaseMessage *)msg {
        NSLog(@"SecondAuthViewController onLoginSuccess");
        [self saveLoginInfo];

        if (![[[SFUemSDK sharedInstance].config getOption:SFSDKOptionUsingSdkRandCodeUI] boolValue] && [self.navigationController.topViewController isKindOfClass:[SFRandCodeSdpViewController class]]) {
            SFRandCodeSdpViewController *vc = (SFRandCodeSdpViewController *)self.navigationController.topViewController;
            [vc.navigationController popViewControllerAnimated:YES];
        }

        [MBProgressHUD hideHUDForView:self.view animated:YES];
        [AlertUtil showAlert:@"" message:@"认证成功" completion:^{
            [self showTestList];
        }];
    }

4、认证失败

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

示例代码如下:

    /**
    * 认证失败的回调
    *
    * @param msg 错误信息
    */
    - (void)onAuthFailed:(BaseMessage *)msg {
        NSLog(@"SecondAuthViewController onLoginFailed:%@", msg);
        if (![[[SFUemSDK sharedInstance].config getOption:SFSDKOptionUsingSdkRandCodeUI] boolValue] && [self.navigationController.topViewController isKindOfClass:[SFRandCodeSdpViewController class]]) {
            SFRandCodeSdpViewController *vc = (SFRandCodeSdpViewController *)self.navigationController.topViewController;
            [vc hideLoading];

            if (msg.errCode == 75500308) { // 图形验证码错误
                [vc showRandCodeFailView];
            } else {
                [vc.navigationController popViewControllerAnimated:YES];
            }
        }

        [MBProgressHUD hideHUDForView:self.view animated:YES];
        [AlertUtil showAlert:@"认证失败" message:[NSString stringWithFormat:@"%@,code=%ld",msg.errStr,(long)msg.errCode]];
    }

5、重新获取图形验证码

onRegetRandCode接口详情

示例代码如下:

SFUemSDK.getInstance().getSFAuth().regetRandCode(new SFRegetRandCodeListener() {
    @Override
    public void onRegetRandCode(boolean success, byte[] bytes, int byteLength) {
        //bytes图片数据
        if (success) {
            SFLogN.info(TAG, "获取图形验证码数据成功");
        }
    }
});

results matching ""

    No results matching ""