将带有完成处理程序的 Firebase IdToken 添加到每个 AlamoFire 请求

Posted

技术标签:

【中文标题】将带有完成处理程序的 Firebase IdToken 添加到每个 AlamoFire 请求【英文标题】:Adding Firebase IdToken with Completion Handler to Every AlamoFire Request 【发布时间】:2019-02-23 21:00:57 【问题描述】:

我了解如何添加客户 HTTP 请求标头,例如授权令牌,like this SO Question

我的复杂之处在于使用 Firebase API 来获取不记名令牌,因为它有一个完成处理程序,以防不记名令牌过期,刷新令牌用于尝试获取新的不记名令牌:

static func getIdToken(completion: @escaping (String?, Error?) -> Swift.Void) 
    guard let user =  Auth.auth().currentUser else 
        print("No Firebase User!")
        completion(nil, nil)
        return
    

    user.getIDToken  (idToken, error) in
        if(error != nil ) 
            print("AuthUtiltiy, error retrieving token: \(error!.localizedDescription)")
            completion(nil, error)
            return
        

        completion(idToken, nil);
    

我已经开始围绕 AlamoFire SessionManager 进行抽象,我可以在其中添加额外的 HTTP 请求标头: 类库API:NSObject

private var manager = Alamofire.SessionManager.default

// Setups the cookie and shared instance
override init() 
    let defaultHeaders = manager.session.configuration.httpAdditionalHeaders ?? [:]
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = defaultHeaders
    manager = Alamofire.SessionManager(configuration: configuration)

但由于 Firebase getIdToken 调用中的回调/完成处理程序,我无法在我的抽象初始化中为每个请求添加身份验证令牌。

我也尝试使用 AlamoFire 来处理我的实际 HTTP 请求,但我仍然遇到同样的问题。

我认为我不能再次使用 RequestAdapter、introduced in AlamoFire 4.0,因为相同的 Firebase.getIdToken 回调/完成处理程序。

【问题讨论】:

【参考方案1】:

正如您所指出的,由于 RequestAdapter 是同步的,因此在 Alamofire 4 中支持这一点并不容易。然而,在 Alamofire 5(目前处于测试阶段)中,RequestAdapter 被更新为异步,这正是此处发布的原因。如果可以的话,更新将是优雅地支持这种情况的最简单方法。

【讨论】:

以上是关于将带有完成处理程序的 Firebase IdToken 添加到每个 AlamoFire 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 和 firebase 正确使用完成处理程序?

Swift 完成处理程序 - 转义尾随闭包

使用完成处理程序按顺序执行操作

未调用 Firebase 存储完成处理程序

Firebase Swift 3 完成处理程序 Bool

使用 Firebase 的 Swift 完成处理程序