TSAuthentication SDK iOS
简介
通过 Passkeys 强认证为您的原生 iOS 应用程序提供功能,同时提供原生体验。本指南描述了如何使用我们的 iOS SDK 注册凭据,并使用它们进行登录和交易批准场景的认证。对于交易批准流程,根据 PSD2.0 SCA 对交易进行签名。
它是如何工作的
此 SDK 实现 Apple 的 公开-私有密钥认证,用于 密钥。它允许你将基于 FIDO2 的生物识别认证添加到你的 iOS 应用中,同时为用户提供原生体验,而不是基于浏览器的体验。
使用密钥,凭证将被设备安全地存储在iCloud密钥链中。这些凭证必须与您的域相关联,以便在您的移动应用程序和您的网站(如果您有的话)之间共享。Transmit iOS SDK还会在设备本身对凭证进行加密绑定,确保只能由注册它的设备使用。
优点
SDK比API具有许多优势,包括
- 编排功能以支持决策和复杂流程
- 客户端WebAuthn调用,以及前后数据处理
- 存储本地状态,包括设备的注册状态、已知用户等
- 简化了对Transmit服务的所有调用,减少了不必要复杂性
- 自动处理跨设备流程的追踪,使用简单的事件处理器
要求
对于密钥认证的要求包括
- iOS 15.0+(或iOS 16.0+用于密钥)
- Xcode 13.0+(或Xcode 14.0+用于密钥)
- 注册了生物特征的设备(例如,FaceID或TouchID)
- 与用户的Apple ID注册的设备
- 开启iCloud KeyChain的设备
先决条件
步骤 1: 配置您的应用
为了与Transmit集成,您需要配置一个应用。从应用页面,创建一个新的应用或使用现有的一个。从应用设置
- 对于客户端类型,选择本机
- 对于重定向URI,输入您的网站URL。这是必填字段,但在此流程中不使用。
- 获取API调用客户端ID和密钥,这些在应用创建时自动生成。
步骤 2: 配置认证方法
从认证页面,配置应用程序(名称显示在页面顶部的下拉列表中)的WebAuthn登录方法
-
对于WebAuthn RP ID,添加您的网站完整域名(例如,www.example.com)。这是在步骤3中与证书相关联的域名。
-
对于WebAuthn RP Origin,使用https://YOUR_DOMAIN,其中YOUR_DOMAIN是您的网站域名,您将其配置为RP ID(例如,https://www.example.com)。这是在请求使用passkey证书进行注册和认证时将提供的源。
步骤 3: 关联您的域名
为了支持passkeys,Apple要求将域名与相关的证书类型关联(如此处所述)。这可以通过将关联域名文件添加到您的网站以及您的应用中适当的权益来完成。
要使用Apple的示例代码项目,请按照这些步骤操作。域名应设置为您的域名,并匹配步骤2中配置的WebAuthn RP ID。有关关联域名的更多信息,请点击这里。
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。有关使用和安装说明,请访问他们的网站。要使用 CocoaPods 将 TSAuthenticationSDK 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它。
pod 'TSAuthenticationSDK', '~> 1.0.0'
Swift 包管理器
Swift 包管理器 是一个用于自动化 Swift 代码分布的工具,集成到 swift
编译器中。它处于早期开发阶段,但 TSAuthenticationSDK 支持在支持平台上使用它。
一旦您设置了 Swift 包,将 TSAuthenticationSDK 作为依赖项添加就像将其添加到您的 Package.swift
的 dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/TransmitSecurity/authentication-ios-sdk", .upToNextMajor(from: "1.0.0"))
]
手动
如果您不想使用上述任何依赖管理器,您可以手动将 TSAuthenticationSDK 集成到项目中。
嵌入式框架
-
手动下载 TSAuthenticationSDK 框架,打开新的
TSAuthenticationSDK
文件夹,并将TSAuthenticationSDK.xcframework
拖入应用程序的 Xcode 项目的“项目框架”目录。 -
这就完成了!
TSAuthenticationSDK.framework
将自动作为目标依赖项、链接框架和嵌入框架添加到“复制文件”构建阶段,这是您在模拟器和设备上构建所需的所有内容。
用法
初始化 SDK
let config = TSConfiguration()
config.domain = "YOUR_DOMAIN"
TSAuthentication.shared.initialize(baseUrl: "https://webauthn.identity.security/v1",
clientId: "CLIENT_ID", configuration: config) { response, error in
if let error {
print("SDK initialization failed \(String(describing: error.code))
\(String(describing: error.message))")
} else {
//Send the response.publicKey to the server
print("SDK initialized")
}
}
准备注册
TSAuthentication.shared.prepareWebauthnRegistration(username: "USERNAME", authSessionId:
"AUTH_SESSION_ID") { [weak self] success, error in
if let error {
//Handle error
} else {
//Complete the registration flow
} }
完成注册
TSAuthentication.shared.executeWebauthnRegistration { [weak self] response, error in
if let error {
//Handle error
} else {
//User registered successfully. Use response.authCode for the token exchange
} }
准备认证
TSAuthentication.shared.prepareWebauthnAuthentication(username: "USERNAME") { [weak
self] success, error in
if let error {
//Handle error
} else {
//Complete the authentication flow
} }
完成认证
TSAuthentication.shared.executeWebauthnAuthentication { [weak self] response, error in
if let error {
//Handle error
} else {
//User is authenticated. Use response.authCode for the token exchange
} }
准备事务签名
let approvalData = [ "payee": "Acme", "payment_method": "Acme card", "pay_amount"
: "200"]
TSAuthentication.shared.prepareWebauthnSignTransaction(username: "USERNAME",
approvalData: approvalData) { [weak self] success, error in
if let error {
//Handle error
} else {
//Complete the transaction signing flow
} }
完成事务签名
TSAuthentication.shared.executeWebauthnSignTransaction() { [weak self] response, error
in
if let error {
//Handle error
} else {
//User has authenticated successfully. You can use the response.authCode for
token exchange.
}
}
作者
传输安全,https://github.com/TransmitSecurity
许可证
本工程采用Apache 2.0许可证。有关更多信息,请参阅LICENSE文件。