守护者 1.4.2

Guardian 1.4.2

测试已测试
Lang语言 SwiftSwift
许可证 MIT
Released上次发布2024年5月
SPM支持 SPM

Hernan ZalazarIonut ManolacheAndy Jung 维护。



Guardian 1.4.2

Guardian.swift (iOS)

CircleCI Coverage Status Version License Platform Carthage compatible Swift 4.1

Guardian 是 Auth0 的多因素身份验证 (MFA) 服务,可为您提供简单、安全的 MFA 实现。

Auth0 是一个认证代理,支持社交身份提供者以及诸如 Active Directory、LDAP、Google Apps 和 Salesforce 的企业身份提供者。

此 SDK 允许您将 Auth0 的 Guardian 多因素服务集成到自己的应用程序中,将其转换为自身第二个因素。您的用户将享受到我们无摩擦的多因素身份验证的所有好处。

要求

为了使用 Guardian,需要 iOS 10+ 和 Swift 4.1。

准备工作

为了使用此 SDK,您必须配置您的租户的 Guardian 服务与您自己的推送通知凭据,否则您将不会收到任何推送通知。请阅读有关如何实现的文档

安装

CocoaPods

Guardian.swift 可以通过 CocoaPods 使用。要安装它,只需将以下行添加到您的 Podfile 中

pod 'Guardian', '~> 1.0.0'

Carthage

在您的 Cartfile 中添加以下行

github "auth0/Guardian.swift" ~> 1.0.0

使用

Guardian 是 SDK 的核心。为了开始操作,您必须导入该库

import Guardian

然后,您需要 Auth0 Guardian 域用于您的账户

let domain = "{YOUR_ACCOUNT_NAME}.guardian.auth0.com"

注册

注册是在第二因素和 Auth0 账户之间的一个链接。当账户注册后,您将需要提供要验证身份所需的第二因素。

除了您的 Guardian 域外,您还需要以下这些事物进行注册

  • 注册 Uri:从 Guardian Web Widget 扫描的二维码中编码的值或在发送给您的注册券(例如通过电子邮件)中的值。
  • APNS 令牌:设备和 Apple APNS 令牌 必须 是包含 64 字节(以十六进制格式表示)的 String
  • 签名和验证密钥:RSA(私钥/公钥)密钥对,用于在 Auth0 Guardian 中断言您的身份。

如果您尚未使用推送通知或对它不熟悉,您应查看他们的 文档

在获得所有这些后,您可以注册您的设备

Guardian
        .enroll(forDomain: "{YOUR_GUARDIAN_DOMAIN}",
                usingUri: "{ENROLLMENT_URI}",
                notificationToken: "{APNS_TOKEN}",
                signingKey: signingKey,
                verificationKey: verificationKey
                )
        .start { result in
            switch result {
            case .success(let enrolledDevice):
                // success, we have the enrollment device data available
            case .failure(let cause):
                // something failed, check cause to see what went wrong
            }
        }

成功后,您将获得注册信息,这些信息应安全存储在您的应用程序中。这些信息包括注册标识符和与您的设备关联的守护者API的令牌,用于更新或删除您的注册。

签名和验证密钥

Guardian.swift提供了生成签名密钥的便利类。

let signingKey = try DataRSAPrivateKey.new()

此密钥仅在内存中存在,但您可以获取其Data表示并安全存储,例如在加密的SQLiteDB中。

// Store data
let data = signingKey.data
// performthe storage

// Load from Storage
let loadedKey = try DataRSAPrivateKey(data: data)

但如果是想要存储在iOS Keychain中

let signingKey = try KeychainRSAPrivateKey.new(with: "com.myapp.mytag")

它将创建并自动在提供的标签下存储,如果您要使用该标签检索它

let signingKey = try KeychainRSAPrivateKey(tag: "com.myapp.mytag")

标签应该是唯一的,因为它是iOS Keychain中每个密钥的标识符。

至于验证密钥,我们只需从任何SigningKey中获取即可

let verificationKey = try signingKey.verificationKey()

允许登录请求

一旦设置了注册,每次用户需要使用MFA验证身份时,您都会收到推送通知。

Guardian提供了一个方法来解析从APNs接收到的数据,并返回一个准备好使用的Notification实例。

if let notification = Guardian.notification(from: userInfo) {
    // we have received a Guardian push notification
}

一旦您有了通知实例,您就可以通过使用allow方法轻松允许认证请求。您还需要一些从之前注册的设备获得的信息。如果您有多个注册,您必须找到具有相同id的注册(即通知的enrollmentId属性)。

一旦有了这些信息,device参数是实现了AuthenticatedDevice协议的任何内容

struct Authenticator: Guardian.AuthenticationDevice {
    let signingKey: SigningKey
    let localIdentifier: String
}

本地标识符是设备的本地id,默认情况下在注册时为UIDevice.current.identifierForVendor

然后只需调用

Guardian
        .authentication(forDomain: "{YOUR_GUARDIAN_DOMAIN}", device: device)
        .allow(notification: notification)
        .start { result in
            switch result {
            case .success:
                // the auth request was successfuly allowed
            case .failure(let cause):
                // something failed, check cause to see what went wrong
            }
        }

拒绝登录请求

要拒绝认证请求,请调用reject。如果您想的话,也可以发送拒绝原因。拒绝原因将在守护者日志中可用。

Guardian
        .authentication(forDomain: "{YOUR_GUARDIAN_DOMAIN}", device: device)
        .reject(notification: notification)
        // or reject(notification: notification, withReason: "hacked")
        .start { result in
            switch result {
            case .success:
                // the auth request was successfuly rejected
            case .failure(let cause):
                // something failed, check cause to see what went wrong
            }
        }

注销

如果您想删除一个注册项 - 例如,如果您想禁用多因素认证 - 您可以提出以下请求

Guardian
        .api(forDomain: "{YOUR_GUARDIAN_DOMAIN}")
        .device(forEnrollmentId: "{USER_ENROLLMENT_ID}", token: "{ENROLLMENT_DEVICE_TOKEN}")
        .delete()
        .start { result in
            switch result {
            case .success:
                // success, the enrollment was deleted
            case .failure(let cause):
                // something failed, check cause to see what went wrong
            }
        }

什么是Auth0?

Auth0可以帮助您

  • 添加多种认证来源的认证,可以是社交平台如 Google、Facebook、Microsoft account、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 account登录。

问题报告

如果您发现了错误或有功能请求,请在此存储库问题部分进行报告。请在公共GitHub问题跟踪器上不要报告安全漏洞。有关披露安全问题的负责任披露程序详细说明了披露程序。

作者

Auth0

许可证

本项目采用MIT许可。有关更多信息,请参阅LICENSE文件。