TouchIDAuth 0.2.0

TouchIDAuth 0.2.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2015年10月

Hernan Zalazar 维护。



  • 作者
  • Hernan Zalazar

TouchIDAuth 通过使用 TouchID 和 JWT 实现了一个无密码登录流程的默认实现。

TouchID Flow

流程如下所示

  1. 使用 TouchID 验证用户的存在
  2. 检查用户是否有密钥对
    1. 生成密钥对
    2. 注册用户的公钥。
  3. 使用 RS256 生成 JWT 并使用私钥签名
  4. 使用签名的 JWT 验证用户。

TouchID demo

要求

该库需要 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];

然后需要在认证流程期间调用的几个回调中配置一些回调。有三个回调,registerPublicKeyjwtPayloadauthenticate

回调 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

API

A0TouchIDAuthentication

A0TouchIDAuthentication#registerPublicKey

@property (copy, nonatomic) void(^registerPublicKey)(NSData *pubKey, A0RegisterCompletionBlock completionBlock, A0ErrorBlock errorBlock);

处理与API端点公钥注册的块。它将接收3个参数:publicKey、completionBlock和errorBlock。公钥格式为RSA公钥。

A0TouchIDAuthentication#jwtPayload

@property (copy, nonatomic) NSDictionary *(^jwtPayload)();

返回用于在设备上签名JWT的负载的块。每次需要生成和签名JWT时都会调用它。默认情况下,A0TouchIDAuth将包括iatexp(30秒)和sub(公钥指纹)主张,但您可以通过覆盖它们或在负载中添加更多条目来替代。

A0TouchIDAuthentication#authenticate

@property (copy, nonatomic) void(^authenticate)(NSString *jwt, A0ErrorBlock errorBlock);

使用已签名的JWT对API端点进行身份验证时调用的块。

A0TouchIDAuthentication#onError

@property (copy, nonatomic) void(^onError)(NSError *error);

在身份验证流程中发生错误时调用的块。

A0TouchIDAuthentication#localizedTouchIDMessage

@property (copy, nonatomic) NSString *localizedTouchIDMessage;

在TouchID提示中显示的本地化消息。

A0TouchIDAuthentication#start

- (void)start;

开始TouchID身份验证流程。如果isTouchIDAuthenticationAvailable返回NO,则将自动失败。

A0TouchIDAuthentication#isTouchIDAuthenticationAvailable

- (BOOL)isTouchIDAuthenticationAvailable;

检查设备是否支持并启用了TouchID。

A0TouchIDAuthentication#reset

- (void)reset;

重置保存在设备中的TouchID身份验证信息。

问题报告

如果您发现了一个错误或您有一个功能请求,请在此存储库的“问题”部分报告它们。请勿在公共GitHub问题跟踪器上报告安全漏洞。有关披露安全问题的程序,请参阅负责任的披露计划

作者

Auth0

什么是Auth0?

Auth0帮助您

  • 通过多种身份验证源添加身份验证,如社会性身份验证(如Google、Facebook、Microsoft账户、LinkedIn、GitHub、Twitter、Box、Salesforce等),或者企业身份系统,如(Windows Azure AD、Google Apps、Active Directory、ADFS或任何SAML身份提供者)。
  • 通过更传统的(如用户名/密码数据库)进行身份验证。
  • 支持将不同的用户账户与同一用户关联
  • 支持生成签名Json Web Tokens以调用您的API并安全地流转用户身份
  • 分析用户登录的时间、地点和方式。
  • 通过JavaScript规则从其他来源提取数据并将其添加到用户资料中。

在Auth0中创建免费账户

  1. 转到Auth0并点击注册。
  2. 使用Google、GitHub或Microsoft账户登录。

许可证

TouchIDAuth可以在MIT许可证下使用。有关更多信息,请参阅许可证文件