Guardian.swift (iOS)
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中创建免费账户
- 访问 Auth0 并点击“注册”。
- 使用Google、GitHub或Microsoft account登录。
问题报告
如果您发现了错误或有功能请求,请在此存储库问题部分进行报告。请在公共GitHub问题跟踪器上不要报告安全漏洞。有关披露安全问题的负责任披露程序详细说明了披露程序。
作者
许可证
本项目采用MIT许可。有关更多信息,请参阅LICENSE文件。