Okta 安全存储库
此库是对 iOS 的 LocalAuthentication
和 Security
框架的 Swift 封装。该库通过提供机制来让您的应用程序将少量用户数据以加密形式存储在数据库中,从而提供方便的 API 来利用密钥链服务。密钥链不仅限于密码和令牌。您可以存储用户明确关心的其他秘密,例如信用卡信息或简短笔记。
存储库包括以下功能
- 获取、设置和删除密钥链项目。
- 将数据存储在指纹或面部识别等生物识别因素之后。
目录
- 用法
- 创建 OktaSecureStorage 类的实例
- 将数据保存到密钥链
- 将数据保存到带有生物识别因素的密钥链后
- 从密钥链加载数据
- 从密钥链删除数据
- API 参考
- 如何在 Objective-C 项目中使用此库
- 贡献
用法
将 import OktaSecureStorage
添加到源代码中。
OktaSecureStorage
类实例
创建 let oktaStorage = OktaSecureStorage()
or
let oktaStorage = OktaSecureStorage(applicationPassword: "user_password")
将数据保存到密钥链
do {
try oktaStorage.set(string: "password", forKey: "jdoe")
} catch let error {
// Handle error
}
在生物特征因素之后将数据保存到密钥链
do {
try oktaStorage.set(string: "password", forKey: "jdoe" behindBiometrics: true)
} catch let error {
// Handle error
}
从密钥链加载数据
do {
let password = try oktaStorage.get("jdoe")
} catch let error {
// Handle error
}
另,如果您需要知道已存储的键
do {
let keys = try oktaStorage.getStoredKeys()
} catch let error {
// Handle error
}
从密钥链删除数据
do {
try oktaStorage.delete("jdoe")
} catch let error {
// Handle error
}
API参考
init(applicationPassword:)
初始化OktaSecureStorage实例。可选参数applicationPassword
允许使用额外的密码来保护密钥链中的项目。这样,如果用户没有设置密码码或Touch ID,项目仍然会被保护,而且如果设置了密码码,这会添加一个额外的安全层。
set(string:forKey:)
在密钥库中安全存储一个项目。方法在成功时返回 true,在出现错误时返回 false。
do {
try oktaStorage.set("password", forKey: "jdoe")
} catch let error {
// Handle error
}
set(string:forKey:behindBiometrics:)
安全存储一个项目,并接受额外的 behindBiometrics
参数。如果您想将密钥库项目存储在生物识别因素(如触摸ID或面容ID)之后,请将该参数设置为 true
。
do {
try oktaStorage.set("password", forKey: "jdoe" behindBiometrics: true)
} catch let error {
// Handle error
}
set(string:forKey:behindBiometrics:accessGroup:)
安全存储一个项目,并接受额外的 accessGroup
标识符。使用 accessGroup
在应用程序之间共享密钥库项目。位于同一组的两个或多个应用程序可以共享密钥库项目,因为它们共享一个常见的密钥库访问组权限。有关详细信息,请参阅在应用程序集合之间共享对密钥库项目的访问权限。
do {
try oktaStorage.set("password",
forKey: "jdoe",
accessGroup: "TEAMSEEDID.com.mycompany.sharedkeychain")
} catch let error {
// Handle error
}
set(string:forKey:behindBiometrics:accessibility:)
安全存储一个项目,并接受额外的 accessibility
参数。使用 accessibility
参数来指示何时访问密钥库项目。根据您的应用程序需求选择最严格的选项,以便系统可以尽可能有效地保护该项目。可能的值列在这里此处。请注意,accessibility参数的默认值是kSecAttrAccessibleWhenUnlockedThisDeviceOnly - 具有该属性的项目不会迁移到新设备。
do {
try oktaStorage.set("password",
forKey: "jdoe",
accessibility: kSecAttrAccessibleWhenUnlockedThisDeviceOnly)
} catch let error {
// Handle error
}
附加辅助函数
set(string: String,
forKey key: String,
accessGroup: String? = nil,
accessibility: CFString?) throws
set(data: Data,
forKey key: String) throws
set(data: Data,
forKey key: String,
behindBiometrics: Bool) throws
set(data: Data,
forKey key: String,
behindBiometrics: Bool,
accessGroup: String) throws
set(data: Data,
forKey key: String,
behindBiometrics: Bool,
accessibility: CFString) throws
set(data: Data,
forKey key: String,
accessGroup: String?,
accessibility: CFString?) throws
get(key:biometricPrompt:)
从密钥库中检索存储的密钥链项。此外,此方法还期望一个可选的密钥链项的prompt
消息,该密钥链项存储在生物身份验证因素之后。
- 注意:如果启用了生物识别存储,iOS将显示原生的触控ID或面容ID消息视图。这意味着函数可能会被阻塞并等待用户操作。建议在后台线程调用
get
函数。
DispatchQueue.global().async {
do {
let password = try oktaStorage.get("jdoe", prompt: “Please use Touch ID or Face ID to sign in”)
} catch let error {
// Handle error
}
}
getData(key:biometricPrompt:)
从密钥库中检索存储的密钥链项。此外,此方法还期望一个可选的密钥链项的prompt
消息,该密钥链项存储在生物身份验证因素之后。
- 注意:如果启用生物识别存储,iOS将显示原生的触控ID或面容ID消息视图。这意味着函数可能会被阻塞并等待用户操作。建议在后台线程调用
getData
函数。
DispatchQueue.global().async {
do {
let passwordData = try oktaStorage.getData("jdoe", prompt: “Please use Touch ID or Face ID to sign in”)
} catch let error {
// Handle error
}
}
getStoredKeys(biometricPrompt:accessGroup:)
从密钥库中检索之前存储的密钥。此外,此方法还期望一个可选的密钥链项的prompt
消息,该密钥链项存储在生物身份验证因素之后。使用accessGroup
访问应用程序之间的共享密钥库项。
- 注意:与
getData
函数类似,如果启用生物识别存储,iOS将显示原生的触控ID或面容ID消息视图。这意味着函数可能会被阻塞并等待用户操作。建议在后台线程调用getStoredKeys
函数。
DispatchQueue.global().async {
do {
let keys = try oktaStorage.getStoredKeys()
} catch let error {
// Handle error
}
}
delete(key:)
从密钥库中删除存储的密钥链项。
do {
try oktaStorage.delete("jdoe")
} catch let error {
// Handle error
}
clear()
从钥匙圈中删除所有项目
do {
try oktaStorage.clear()
} catch let error {
// Handle error
}
isTouchIDSupported
检查设备是否已注册Touch ID。如果生物识别不可用、未注册或被锁定,则函数调用将返回false。
let isTouchIDSupported = storageManager.isTouchIDSupported()
isFaceIDSupported
检查设备是否已注册Face ID。如果生物识别不可用、未注册或被锁定,则函数调用将返回false。
let isFaceIDSupported = storageManager.isFaceIDSupported()
如何在Objective-C项目中使用此库
- 将自动生成的Swift头文件包含到您的.m文件中。Swift头文件包含Okta Swift类的Objective-C表示。请注意,头文件的名称由您的项目名称和“-Swift”后缀组成。例如,如果您的项目名称为AuthApp,则自动生成的头文件名称将是“AuthApp-Swift.h”
- 开始使用Swift头文件中可用的编程组件
示例
OktaSecureStorage *storage = [OktaSecureStorage new];
NSError *error;
BOOL success = [storage setWithString:"password" forKey:"jdoe" error:&error];
if (success) {
NSString *password = [storage getWithKey:@"jdoe" error:&error];
if (password != nil) {
success = [storage deleteWithKey:@"jdoe" error:&error];
}
}
贡献
我们非常欢迎贡献和PR!请阅读贡献指南。