我用 Swift 4 编写了一个应用程序,它使用了 Discogs API .因此,我要求用户有权访问其 Discogs 帐户上的个人数据,因此我使用 OAuthSwift 对他们的 API 进行身份验证。 .目前,我能够启动身份验证流程,登录并返回 oauthToken
和 oauthTokenSecret
向他们的 https://api.discogs.com/oauth/identity
发出后续请求我返回了一个用户对象,所以我很高兴此时我可以登录并进行身份验证请求。
但是,我不明白如何在应用首次启动时检查用户是否已通过身份验证。目前,我没有存储响应,而是在嵌套回调中调用身份端点
import UIKit
import OAuthSwift
class ViewController: UIViewController {
let oauthSwift = OAuth1Swift(
consumerKey: "foo",
consumerSecret: "bar",
requestTokenUrl: "https://api.discogs.com/oauth/request_token",
authorizeUrl: "https://www.discogs.com/oauth/authorize",
accessTokenUrl: "https://api.discogs.com/oauth/access_token"
)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
view.backgroundColor = .white
kickOffAuthFlow()
}
fileprivate func kickOffAuthFlow() {
oauthSwift.authorizeURLHandler = SafariURLHandler(viewController: self, oauthSwift: oauthSwift)
guard let callbackURL = URL(string: "foo.bar.boobaz:/oauth_callback") else { return }
oauthSwift.authorize(withCallbackURL: callbackURL, success: { (credential, response, parameters) in
_ = self.oauthSwift.client.get("https://api.discogs.com/oauth/identity", success: { (response) in
guard let dataString = response.string else { return }
print(dataString)
}, failure: { (error) in
print("error")
})
}) { (error) in
print(error.localizedDescription)
}
}
}
在这种情况下,最佳做法是什么?我应该如何存储这些 token 以及我应该如何确保一旦用户登录,他们不会在下次打开应用程序时被迫登录(前提是 token 尚未过期,但这是我的另一个问题准备稍后处理)
来自 Web 开发背景,我能够只在 session 存储中存储一个 token ,然后在加载时我会检查 token 上的 exp 并请求一个新 token 或采取一些其他操作。
我还没有完全理解这在 iOS 开发中是如何工作的。
最佳答案
在本地存储访问 token 有两种选择。
- 用户默认
- 钥匙串(keychain)
<强>1。用户默认
使用 UserDefault 将 token 存储在内存中。当应用程序启动时,检查 token 是否存储在 userdafault 中。 UserDefault 用作短内存存储,您可以在其中存储小数据。如果您终止应用程序,它会保留在内存中。
let tokenIdentifier = "TokenIdentifier"
func storeAccessToken(token: String) {
UserDefaults.standard.set(token, forKey: tokenIdentifier)
}
func checkUserLogin() {
if UserDefaults.standard.value(forKey: tokenIdentifier) != nil {
print("User is Login")
}
else {
print("User need to login")
}
}
检查此以了解有关 userdefault 的更多信息
https://swift3tutorials.com/swift-3-user-defaults/
https://www.hackingwithswift.com/example-code/system/how-to-save-user-settings-using-userdefaults
<强>2。 key 扣
Userdefault 不安全。访问 token 是一种敏感信息,应存储在安全的地方。因此,将访问 token 存储在用户默认值中并不是正确的选择。您必须将访问 token 存储在钥匙串(keychain)中。使用 SwiftKeychainWrapper pod 将 token 存储在钥匙串(keychain)中。
let tokenIdentifier = "TokenIdentifier"
func storeAccessToken(token: String) {
KeychainWrapper.standard.set(token, forKey: tokenIdentifier)
}
func checkUserLogin() {
let token: String? = KeychainWrapper.standard.string(forKey: tokenIdentifier)
if token != nil {
print("User is Login")
}
else {
print("User need to login")
}
}
关于iOS swift 4 OAuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48248575/