在 OS10 中使用返回 nil 的 A0SimpleKeychain 检索钥匙串值
Retrieving keychain value with A0SimpleKeychain returning nil in OS10
我是 swift 的新手,请多多包涵。我正在尝试使用 Auth0 的库 A0SimpleKeychain 存储用户的令牌:https://github.com/auth0/SimpleKeychain。我遵循了他们的文档,并想出了这个登录功能:
@IBAction func login(_ sender: UIButton) {
let payload: Parameters = [
"username": self.usernameTextField.text!,
"password": self.passwordTextField.text!
]
Alamofire.request("my/url", method: .post, parameters: payload, encoding: JSONEncoding.default).responseJSON { response in
let json = JSON(response.result.value)
let token = json["token"]
let jwtToken = token.string!
A0SimpleKeychain().setString(jwtToken, forKey:"user-jwt")
let jwt = A0SimpleKeychain().string(forKey: "user-jwt")
print(jwt)
}
}
我遇到的问题是 print(jwt)
应该打印令牌,而打印 nil
。如果我打印出 jwtToken
然后它打印出正确的值所以我知道它不是零。我试过只放一个 "test" 字符串来查看我的 jwtToken
是否有任何问题,因为我仍在理解可选值并展开它们,但它也只是返回 nil。
A0SimpleKeychain().setString("testString", forKey:"user-jwt")
我 运行 OSX 10.11.6 和 Swift 3
代码没有问题。这是一个项目设置问题。钥匙链不存在于真空中;为了安全起见,它们只允许通过您的代码签名应用程序指定的权利进行操作,并且由于代码签名,这些权利在构建时被密封。看来 Xcode / iOS 10 中的一个错误,至少在模拟器中,没有遵守或没有设置默认钥匙串权利 application-identifier
并且要激活它,您还必须启用 keychain-access-groups
权利。
[编辑] 如果您将构建目标更改为 8.4 并模拟 8.4 设备,您将看到它在不修改设置的情况下工作。
要在 iOS 10 下工作,在目标的项目设置下,转到第二个选项卡 Capabilities
并启用 "Keychain Sharing"。系统将提示您输入 Apple ID 密码,并询问要将钥匙串附加到哪个 Apple ID。
您深入了解的错误代码是-34018。您确实需要检查 setString
的 return 值,可以是 false
.
(编辑)
参考:
A0SimpleKeyChain.m:151 OSStatus status = SecItemAdd((__bridge CFDictionaryRef)newQuery, NULL);
-> -34018
SecItemAdd and SecItemCopyMatching returns error code -34018 (errSecMissingEntitlement)
"From a high level perspective, Keychain Services uses an app’s code signature with its embedded entitlements to ensure that only an authorized app can access a particular keychain item."
我是 swift 的新手,请多多包涵。我正在尝试使用 Auth0 的库 A0SimpleKeychain 存储用户的令牌:https://github.com/auth0/SimpleKeychain。我遵循了他们的文档,并想出了这个登录功能:
@IBAction func login(_ sender: UIButton) {
let payload: Parameters = [
"username": self.usernameTextField.text!,
"password": self.passwordTextField.text!
]
Alamofire.request("my/url", method: .post, parameters: payload, encoding: JSONEncoding.default).responseJSON { response in
let json = JSON(response.result.value)
let token = json["token"]
let jwtToken = token.string!
A0SimpleKeychain().setString(jwtToken, forKey:"user-jwt")
let jwt = A0SimpleKeychain().string(forKey: "user-jwt")
print(jwt)
}
}
我遇到的问题是 print(jwt)
应该打印令牌,而打印 nil
。如果我打印出 jwtToken
然后它打印出正确的值所以我知道它不是零。我试过只放一个 "test" 字符串来查看我的 jwtToken
是否有任何问题,因为我仍在理解可选值并展开它们,但它也只是返回 nil。
A0SimpleKeychain().setString("testString", forKey:"user-jwt")
我 运行 OSX 10.11.6 和 Swift 3
代码没有问题。这是一个项目设置问题。钥匙链不存在于真空中;为了安全起见,它们只允许通过您的代码签名应用程序指定的权利进行操作,并且由于代码签名,这些权利在构建时被密封。看来 Xcode / iOS 10 中的一个错误,至少在模拟器中,没有遵守或没有设置默认钥匙串权利 application-identifier
并且要激活它,您还必须启用 keychain-access-groups
权利。
[编辑] 如果您将构建目标更改为 8.4 并模拟 8.4 设备,您将看到它在不修改设置的情况下工作。
要在 iOS 10 下工作,在目标的项目设置下,转到第二个选项卡 Capabilities
并启用 "Keychain Sharing"。系统将提示您输入 Apple ID 密码,并询问要将钥匙串附加到哪个 Apple ID。
您深入了解的错误代码是-34018。您确实需要检查 setString
的 return 值,可以是 false
.
(编辑)
参考:
A0SimpleKeyChain.m:151 OSStatus status = SecItemAdd((__bridge CFDictionaryRef)newQuery, NULL);
-> -34018
SecItemAdd and SecItemCopyMatching returns error code -34018 (errSecMissingEntitlement)
"From a high level perspective, Keychain Services uses an app’s code signature with its embedded entitlements to ensure that only an authorized app can access a particular keychain item."