我对斯威夫特不熟悉,所以请容忍我。我正在尝试使用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中的一个bug,至少在模拟器中,不尊重或不设置默认的密钥链权利application-identifier
,要激活它,您还必须启用keychain-access-groups
权利。
[编辑]如果将生成目标更改为8.4并模拟8.4设备,您将看到它在不修改设置的情况下工作。
要在ios 10下工作,在目标的项目设置下,转到第二个选项卡Capabilities
并启用“keychain sharing”。系统会提示您输入Apple ID密码,并询问您要将密钥链附加到哪个Apple ID。
你得到的错误代码是-34018。您确实需要检查setString
的返回值,它可以是false
。
(编辑)
参考:
a0simplekeychain.m:151OSStatus status = SecItemAdd((__bridge CFDictionaryRef)newQuery, NULL);
>-34018
SecItemAdd and SecItemCopyMatching returns error code -34018 (errSecMissingEntitlement)
https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html
“从高层次的角度来看,密钥链服务使用应用程序的代码签名及其嵌入的权限,以确保只有经过授权的应用程序才能访问特定的密钥链项。”