员工身份(EIAM)

动态口令OTP认证

# 文档说明

本文为您介绍iOS客户端如何接入OTP认证功能。OTP功能,即在用户中心激活后,可在手机APP上获取动态口令, 保证账号安全。

OTP使用场景下,用户登录进用户中心,进入账号设置,账号安全,动态口令设置,按照页面提示激活动态口令,在下一次登录需要OTP二次认证的地方,可借助OTP相关SDK快速实现动态口令生成。

# 流程说明

集成流程说明

  1. App客户端构建完成扫一扫页面功能,扫码得到的字符串,带入IDaaS SDK添加,添加成功返回到OTP列表。

  2. App客户端构建完成OTP口令列表,使用IDaaS SDK获取目前已添加的OTP口令列表。

  3. App客户端在OTP列表中,每30秒或1分钟到IDaaS SDK查询目前单个OTP的动态口令码,继而刷新列表中单个OTP口令。

  4. App客户端在OTP列表中,构建删除单个OTP口令的动画效果,在响应事件中调用IDaaS SDK删除OTP单个口令的方法,并刷新UI。

# 准备工作

  1. 登录IDaaS企业中心平台,点击 “设置-->服务配置-->动态口令配置”,配置口令加密算法,位数和时间间隔。目前SDK支持的算法是HMACSHA1,HMACSHA256H,MACSHA512。

  2. 配置完成后点击 “资源-->应用”,找到企业应用并进入应用面板,开启 “访问控制” 开关,在弹出的设置页面,选择二次认证,勾选二次认证方式为OTP。

# 引入依赖包

在Pod中引入。

pod 'SwiftBase32', '~> 0.9.0'
1

# 添加主库

AuthnCenter_MFA_OTP_2E.framework 
1

将IDaaS SDK拖入工程,引入方式如下:

# Targets设置

  • IDaaS短信登录SDK最低版本可兼容ios 10。

  • 在项目的Frameworks,Libraries,andEmbedded Content里包含以下内容。

Security.framework
Foundation.framework
LocalAuthentication.framework
1
2
3

  • 在Build Settings里面将Defines Module设置为YES。

  • 设置bitcode为NO,如下图。

# 开发集成

# SDK API介绍

IDaaS SDK 不提供任何UI,SDK管理OTP列表,列表通过SDK存储在keychain中,删除APP也不会删除数据,但是可以调用以下删除方法逐个删除清空此列表。列表通过以下方法来增加,删除,查询:

  1. 扫一扫二维码添加OTP。

  2. 通过手动输入参数来添加OTP。

  3. 查询所有的OTP口令列表。

  4. 查询单个OTP口令。

  5. 删除单个OTP口令。

# 扫一扫二维码添加OTP

App客户端扫描二维码得到的字符串,带入添加方法,添加成功返回布尔类型值。

调用例子:

 #import <AuthnCenter_MFA_OTP_2E/BCOTPManager.h>

 
 BOOL flag=  [BCOTPManager addWithUrl:urlStr];
    if(flag){//添加成功,跳转
        [self.navigationController popViewControllerAnimated:YES];
    }else{//添加失败
        [self showAlertWithTitle:@"OTP添加失败" message:nil sureHandler:nil cancelHandler:nil];

    }
1
2
3
4
5
6
7
8
9
10

入参urlStr依照字符串格式:

otpauth://totp/sdk2e:zhangrui1?secret=jw776a3sjogusngvr2u7w57yjoazzo7u6ij2q6uj6r5p3p5anvkdfv2bsvxthncfqjjigedfp35lb6m3trz2zcezlkt736njzxkvy4q%3D&issuer=sdk2e&period=30&digits=6&algorithm=HmacSHA512&logo=null
注:例子中sdk2e是应用名,zhangrui1是用户名
1
2

# 手动输入参数添加OTP

当二维码扫描不可用时候,用户通过手动输入参数也可以添加otp,从用户中心设置页面里,也提供了可手动添加的各种参数,可以利用界面上的参数添加OTP。

调用示例:

 #import <AuthnCenter_MFA_OTP_2E/BCOTPManager.h>
 
[BCOTPManager addManuallyWithAlgorithm:@"HMACSHA512" andWithSecrete:@"22gua6dxykmffoqw5nhnercsckgg3oqhpge2k74xgujgjvmq7ljymwyoazmy6rvj5j4aor5r37dg7honzkxdzgblcsdtmztgo5qtyva=" andWithDigit:6 andWithPeriod:30 andWithIssuer:@"sdk2e" andWithUserName:@"zhangrui1"];
1
2
3

对象方法简介:

/**
algorithm:NSString 算法,例如:HMACSHA1,HMACSHA256H,MACSHA512
secrete:  NSString 秘钥,例如:22gua6dxykmffoqw5nhnercsckgg3oqhpge2k74xgujgjvmq7ljymwyoazmy6rvj5j4aor5r37dg7honzkxdzgblcsdtmztgo5qtyva=
digit:int 位数
period:int刷新时长
issuer:NSString 应用名
userName:NSString 用户名
返回布尔值:YES添加成功/NO添加失败
**/
+(BOOL)addManuallyWithAlgorithm:(NSString*)algorithm andWithSecrete:(NSString*)secrete andWithDigit:(int)digit andWithPeriod:(int)period andWithIssuer:(NSString*)issuer andWithUserName:(NSString*)userName;
1
2
3
4
5
6
7
8
9
10

# 查询所有的OTP口令列表

调用此方法会返回所有的OTP列表。

示例代码:

 [BCOTPManager showAllOTPsWithCallBack:^(NSMutableArray* data) {


    
    }];
1
2
3
4
5

对象简介:

/**
BCOTPShowAllSuccessBlock回调函数:NSArray

**/
+(void)showAllOTPsWithCallBack:(BCOTPShowAllSuccessBlock)callBack;
1
2
3
4
5

回调函数格式:

NSArray里包含:
每一条OTP,是NSArray类型,每一条OTP 包含两个NSDictionary类型,一个是目前的口令,一个是下一个30秒的口令
  


(
        (//第一条OTP
                {//第一条OTP的目前口令
            fromDate = "2023-01-09 09:09:30 +0000";//NSDate类型,按照0时区,如果打印出来需要加8hr
            issuer = "竹云科技";//NSString 应用名
            toDate = "2023-01-09 09:10:00 +0000";//NSDate类型,按照0时区,如果打印出来需要加8小
            userName = zhangrui;//NSString用户名
            value = 148910;//NSString 动态口令码
        },
                {//第一条OTP的下一个口令
            fromDate = "2023-01-09 09:10:00 +0000";//NSDate类型,按照0时区,如果打印出来需要加8hr
            issuer = "竹云科技";
            toDate = "2023-01-09 09:10:30 +0000";
            userName = zhangrui;
            value = 743713;
        }
    ),
        (//第二条OTP
                {//第二条OTP的目前口令
            fromDate = "2023-01-09 09:09:30 +0000";
            issuer = sdk2e;
            toDate = "2023-01-09 09:10:00 +0000";
            userName = zhangrui1;
            value = 662180;
        },
                {//第二条OTP的下一个口令
            fromDate = "2023-01-09 09:10:00 +0000";
            issuer = sdk2e;
            toDate = "2023-01-09 09:10:30 +0000";
            userName = zhangrui1;
            value = 180877;
        }
    )
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 查询单个OTP口令

传入index,可以单个获取OTP的动态口令。

调用示例:

#import <AuthnCenter_MFA_OTP_2E/BCOTPManager.h>

[BCOTPManager loadOtpWithIndex:rowIndex andWithCallBack:^(NSArray* data){
                    dispatch_async(dispatch_get_main_queue(), ^{
                        
                        [_codeArrary replaceObjectAtIndex:rowIndex withObject:data];
                        

                        [_tableView reloadData];
                    });
                }];
1
2
3
4
5
6
7
8
9
10
11

对象简介:

/**
入参:index int类型,是目前列表中OTP所在的index
BCOTPLoadSuccessBlock回调函数返回NSArray类型
**/

+(void)loadOtpWithIndex:(int)index andWithCallBack:(BCOTPLoadSuccessBlock)callBack;
1
2
3
4
5
6

回调函数说明:

返回单条OTP,包含NSArray,里面有两个NSDictionary,一个是目前的OTP口令,一个是下一个30秒的OTP口令


        (
                {
            fromDate = "2023-01-09 09:43:30 +0000";//NSDate类型,按照0时区,如果打印出来需要加8hr
            issuer = "竹云科技";//
            toDate = "2023-01-09 09:44:00 +0000";//NSDate类型,按照0时区,如果打印出来需要加8hr
            userName = zhangrui;//NSString 用户名
            value = 942819;//动态口令
        },
                {
            fromDate = "2023-01-09 09:44:00 +0000";
            issuer = "竹云科技";
            toDate = "2023-01-09 09:44:30 +0000";
            userName = zhangrui;
            value = 868491;
        }
    )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 删除单个OTP口令

可以通过index删除单个OTP。

调用示例:

 BOOL flag= [BCOTPManager deleteOtpWithIndex:indexPath.row];
 
//返回布尔值,YES删除成功/NO删除不成功
1
2
3