TouchIDAuth 通过使用 TouchID 和 JWT 实现了一个无密码登录流程的默认实现。
流程如下所示
该库需要 iOS 8+ 和带有 TouchID 的设备。
要运行示例项目,请克隆仓库,然后在 Example 目录中首先运行 pod install
。然后在 A0ViewController 添加.mock服务器URL的 IP 地址或主机名
#define kBaseURL @"http://mymac.local:3000"
要运行模拟服务器,请转到文件夹 TouchIDAuthServer 并运行以下命令
npm install
node app.js
首先需要实例化它
A0TouchIDAuthentication *authentication = [[A0TouchIDAuthentication alloc] init];
然后需要在认证流程期间调用的几个回调中配置一些回调。有三个回调,registerPublicKey
、jwtPayload
和 authenticate
。
回调 registerPublicKey
将处理公钥与 API 的注册,并必须在成功时调用 completionBlock
以继续流程(如果失败则调用 errorBlock
)。例如:
authentication.registerPublicKey = ^(NSData *pubKey, A0RegisterCompletionBlock completionBlock, A0ErrorBlock errorBlock) {
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
//Configure AFHTTPRequestOperationManager
[manager POST:@"/pubkey" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
completionBlock();
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
errorBlock(error);
}];
};
};
回调 jwtPayload
在生成 JWT 前被调用,以便提供 API 端点所需的 JWT 负载。例如:
authentication.jwtPayload = ^{
return @{
@"iss": @"Issuer",
@"custom_key": @"value",
};
};
回调 authenticate
将接收签名的 JWT,并需要对 API 端点进行认证。例如:
authentication.authenticate = ^(NSString *jwt, A0ErrorBlock errorBlock) {
NSDictionary *params = @{
@"jwt": jwt,
};
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
//Configure AFHTTPRequestOperationManager
[manager POST:@"/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Logged in!!!");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
errorBlock(error);
}];
};
还有一个额外的回调 onError
,当执行 Auth 流时发生错误时会被调用。
authentication.onError = ^(NSError *error) {
NSLog(@"ERROR %@", error);
};
最后,调用以下方法以启动认证流程:
[authentication start];
在调用
start
之前,建议检查是否在设备中启用了 TouchID,该方法为 isTouchIDAuthenticationAvailable。
@property (copy, nonatomic) void(^registerPublicKey)(NSData *pubKey, A0RegisterCompletionBlock completionBlock, A0ErrorBlock errorBlock);
处理与API端点公钥注册的块。它将接收3个参数:publicKey、completionBlock和errorBlock。公钥格式为RSA公钥。
@property (copy, nonatomic) NSDictionary *(^jwtPayload)();
返回用于在设备上签名JWT的负载的块。每次需要生成和签名JWT时都会调用它。默认情况下,A0TouchIDAuth
将包括iat
、exp
(30秒)和sub
(公钥指纹)主张,但您可以通过覆盖它们或在负载中添加更多条目来替代。
@property (copy, nonatomic) void(^authenticate)(NSString *jwt, A0ErrorBlock errorBlock);
使用已签名的JWT对API端点进行身份验证时调用的块。
@property (copy, nonatomic) void(^onError)(NSError *error);
在身份验证流程中发生错误时调用的块。
@property (copy, nonatomic) NSString *localizedTouchIDMessage;
在TouchID提示中显示的本地化消息。
- (void)start;
开始TouchID身份验证流程。如果isTouchIDAuthenticationAvailable
返回NO
,则将自动失败。
- (BOOL)isTouchIDAuthenticationAvailable;
检查设备是否支持并启用了TouchID。
- (void)reset;
重置保存在设备中的TouchID身份验证信息。
如果您发现了一个错误或您有一个功能请求,请在此存储库的“问题”部分报告它们。请勿在公共GitHub问题跟踪器上报告安全漏洞。有关披露安全问题的程序,请参阅负责任的披露计划。
Auth0帮助您
TouchIDAuth可以在MIT许可证下使用。有关更多信息,请参阅许可证文件。