【问题标题】:Using refresh token to get new authorization token and repeat failed api call使用刷新令牌获取新的授权令牌并重复失败的 api 调用
【发布时间】:2019-09-24 02:34:34
【问题描述】:

我有一个关于在 swift 中使用令牌进行 api 调用的一般性问题。进行 api 调用所需的授权令牌每小时到期一次,因此我需要一种方法来以通用方式处理多个 api 调用。

我遇到了一个问题,如果我收到 401 错误,我会调用一个函数来使用刷新令牌来获取新的授权令牌,并且我想重新调用得到 401 错误的原始函数。

例如:

如果我在调用 getDetails() 时遇到 401 错误,我想调用 getNewAuthToken(),在我获得新的刷新令牌后,我想再次调用 getDetails()

我想以某种方式执行此操作,以便如果我调用任何函数 getX() 并收到 401 错误,它会调用 getNewAuthToken() 然后再次调用原始函数 getX()

在不使用任何外部库等的情况下解决此问题的最佳方法是什么?最好的方法是使用某种回调函数吗?

我提供了我一直在实现的通用代码,但正如您所见,当我收到 401 错误时,它会调用 getNewAuthToken() 函数,但不会再次调用原始函数。如何修改此代码以根据需要运行?

import UIKit
import Combine

@Published var details: Details = nil

func getNewAuthToken(){
// here I request a token using the refresh token

}

func getDetails(){
    self.getCurrentDetails{ details in
        DispatchQueue.main.async {
             self.details = details
        }
    }
}

func getCurrentDetails(_ completionHandler: @escaping (Details) -> ()) {
    let url = "https://api.xxx.com/details"
    guard let detailsURL = URL(string: url) else{
        fatalError("URL not valid")
    }
    let authtoken = keychain.get("authtoken") ?? ""
    var request = URLRequest(url: detailsURL)
    request.httpMethod = "GET"
    request.addValue("Bearer \(authtoken)", forHTTPHeaderField: "Authorization")
    let session = URLSession.shared

    let task = session.dataTask(with: request){
        data, response, error in
        let httpResponse = response as? HTTPURLResponse
        // I request a new token
        if(httpResponse?.statusCode == 401){
            print("401")
            self.getNewAuthToken()
            return
        }
        do {
            if(httpResponse?.statusCode != 200){
                return
            }
            let decoder = JSONDecoder()
            let details = try decoder.decode(Details.self, from:
                data!)
            completionHandler(details)

        } catch  let error2{
            print(error2)
        }
    }
    task.resume()
}

【问题讨论】:

    标签: swift rest networking callback swiftui


    【解决方案1】:

    我认为你不需要分离像“getX()”这样的函数来处理这个问题。您只需要一个完成处理程序。

    func getNewAuthToken(completionHandler: () -> Void) {
    // here I request a token using the refresh token
        completionHandler()
    }
    
    func someNetworkCall() {
        getNewAuthToken {
            someNetworkCall()
        }
    }
    

    【讨论】:

    • 如果我收到 401 错误,我只会调用 getNewAuthToken。在我粘贴的代码中,流程如下:我会调用 getDetails(),然后调用 getCurrentDetails(),我会收到 401 错误,然后调用 getNewAuthToken()。在我获得一个新的身份验证令牌后,getDetails() 或 getCurrentDetails() 将再次被调用以完成该原始请求。
    • 是的,这就是计划。
    • 你能多选一点吗?
    • 您解释了流程。我说的对。我想我没有什么要解释的了。
    猜你喜欢
    • 2016-10-13
    • 2018-08-21
    • 1970-01-01
    • 2016-02-25
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 2020-09-25
    相关资源
    最近更新 更多