动态口令OTP认证
# 文档说明
本文为您介绍iOS客户端如何接入OTP认证功能。OTP功能,即在用户中心激活后,可在手机APP上获取动态口令, 保证账号安全。
OTP使用场景下,用户登录进用户中心,进入账号设置,账号安全,动态口令设置,按照页面提示激活动态口令,在下一次登录需要OTP二次认证的地方,可借助OTP相关SDK快速实现动态口令生成。
# 流程说明
集成流程说明
App客户端构建完成扫一扫页面功能,扫码得到的字符串,带入IDaaS SDK添加,添加成功返回到OTP列表。
App客户端构建完成OTP口令列表,使用IDaaS SDK获取目前已添加的OTP口令列表。
App客户端在OTP列表中,每30秒或1分钟到IDaaS SDK查询目前单个OTP的动态口令码,继而刷新列表中单个OTP口令。
App客户端在OTP列表中,构建删除单个OTP口令的动画效果,在响应事件中调用IDaaS SDK删除OTP单个口令的方法,并刷新UI。
# 准备工作
登录IDaaS企业中心平台,点击 “设置-->服务配置-->动态口令配置”,配置口令加密算法,位数和时间间隔。目前SDK支持的算法是HMACSHA1,HMACSHA256H,MACSHA512。
配置完成后点击 “资源-->应用”,找到企业应用并进入应用面板,开启 “访问控制” 开关,在弹出的设置页面,选择二次认证,勾选二次认证方式为OTP。
# 引入依赖包
在Pod中引入。
pod 'SwiftBase32', '~> 0.9.0'
# 添加主库
AuthnCenter_MFA_OTP_2E.framework
将IDaaS SDK拖入工程,引入方式如下:
# Targets设置
IDaaS短信登录SDK最低版本可兼容ios 10。
在项目的Frameworks,Libraries,andEmbedded Content里包含以下内容。
Security.framework
Foundation.framework
LocalAuthentication.framework
2
3
在Build Settings里面将Defines Module设置为YES。
设置bitcode为NO,如下图。
# 开发集成
# SDK API介绍
IDaaS SDK 不提供任何UI,SDK管理OTP列表,列表通过SDK存储在keychain中,删除APP也不会删除数据,但是可以调用以下删除方法逐个删除清空此列表。列表通过以下方法来增加,删除,查询:
扫一扫二维码添加OTP。
通过手动输入参数来添加OTP。
查询所有的OTP口令列表。
查询单个OTP口令。
删除单个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];
}
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是用户名
2
# 手动输入参数添加OTP
当二维码扫描不可用时候,用户通过手动输入参数也可以添加otp,从用户中心设置页面里,也提供了可手动添加的各种参数,可以利用界面上的参数添加OTP。
调用示例:
#import <AuthnCenter_MFA_OTP_2E/BCOTPManager.h>
[BCOTPManager addManuallyWithAlgorithm:@"HMACSHA512" andWithSecrete:@"22gua6dxykmffoqw5nhnercsckgg3oqhpge2k74xgujgjvmq7ljymwyoazmy6rvj5j4aor5r37dg7honzkxdzgblcsdtmztgo5qtyva=" andWithDigit:6 andWithPeriod:30 andWithIssuer:@"sdk2e" andWithUserName:@"zhangrui1"];
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;
2
3
4
5
6
7
8
9
10
# 查询所有的OTP口令列表
调用此方法会返回所有的OTP列表。
示例代码:
[BCOTPManager showAllOTPsWithCallBack:^(NSMutableArray* data) {
}];
2
3
4
5
对象简介:
/**
BCOTPShowAllSuccessBlock回调函数:NSArray
**/
+(void)showAllOTPsWithCallBack:(BCOTPShowAllSuccessBlock)callBack;
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;
}
)
)
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];
});
}];
2
3
4
5
6
7
8
9
10
11
对象简介:
/**
入参:index int类型,是目前列表中OTP所在的index
BCOTPLoadSuccessBlock回调函数返回NSArray类型
**/
+(void)loadOtpWithIndex:(int)index andWithCallBack:(BCOTPLoadSuccessBlock)callBack;
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;
}
)
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删除不成功
2
3