iOS swift 4 OAuth

标签 ios swift authentication oauth

我用 Swift 4 编写了一个应用程序,它使用了 Discogs API .因此,我要求用户有权访问其 Discogs 帐户上的个人数据,因此我使用 OAuthSwift 对他们的 API 进行身份验证。 .目前,我能够启动身份验证流程,登录并返回 oauthTokenoauthTokenSecret

向他们的 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 有两种选择。

  1. 用户默认
  2. 钥匙串(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/

相关文章:

swift - CFArray takeRetainedValue() 删除导致崩溃

.net - 什么是 OpenID 和 ASP.NET MVC 的最佳 .NET 库?

ios - Xcode 10.1 : Provisioning profile signing certificate error

ios - XCode clang 失败,退出代码为 254

ios - 无效更新: invalid number of sections in UITableView

如果在另一个数组中找到,则快速从数组中获取成员

android - 手机和网站认证

php - Mod Auth CAS 两个登录系统

ios - iOS 播放通知声音的选项

c# - 如何通过 out 参数将变量从 iOS native 代码返回到 C#?