Después de autenticar a un usuario con firebase, obtengo el token de identificación porque mi servicio REST está usando el token de firebase para la autenticación.

En el lado de ios, quiero almacenar este token para que cada solicitud que haga tenga el encabezado de Autorización configurado con el token.

Alamofire doc sugiere usar RequestAdapter https://github.com/ Alamofire / Alamofire / blob / master / Documentation / AdvancedUsage.md # requestadapter

Entonces hago un TokenInterceptor:

import Foundation
import Alamofire

final class TokenInterceptor: Alamofire.RequestInterceptor {
    private var token: String
    
    init(token: String) {
        self.token = token
    }
    
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
        var urlRequest = urlRequest

        urlRequest.setValue("Bearer " + self.token, forHTTPHeaderField: "Authorization")

        completion(.success(urlRequest))
    }
}

Entonces quiero usarlo pero no entiendo cómo usarlo con AF o Session. Aquí está mi clase estatal:

import Foundation
import FirebaseAuth
import Alamofire

class AuthenticationState: NSObject, ObservableObject {
    @Published var user: User?
    @Published var error: NSError?
    @Published var loading: Bool = true
    
    private let auth = Auth.auth()
    
    private var fbUser: FirebaseAuth.User?
    
    func signInWithEmailPassword(email: String, password: String) {
        self.auth.signIn(withEmail: email, password: password, completion: handleAuthResultCompletion)
    }
    
    private func handleAuthResultCompletion(auth: AuthDataResult?, error: Error?) {
        DispatchQueue.main.async {
            self.loading = false
            if let fbUser = auth?.user {
                self.fbUser = fbUser
                fbUser.getIDTokenForcingRefresh(true) { idToken, error in
                  if let error = error {
                    // Handle error
                  }
                
                    // What am I to do here?  How does this affect AF namespace? 
                    Session(interceptor: RequestInterceptor(token: idToken ?? ""))
                    
                    self.me()
                }
            } else if let error = error {
                self.error = error as NSError
            }
        }
    }
    
    private func me() {
        AF.request("http://localhost:8080/api/v1/me").response { response in
            print(response)
        }
    }
}
0
user1354934 27 jul. 2020 a las 23:19

1 respuesta

La mejor respuesta

Puede usar RequestAdapter por - Session o por - Request. El inicializador de Session puede tomar el valor, que luego se usa para todas las solicitudes:

let session = Session(interceptor: Interceptor(adapter: YourAdapter()))

O puede configurarlo en una solicitud:

AF.request(..., interceptor: Interceptor(adapter: YourAdapter()).response ...

Puede leer más en nuestro {{X0} } documentación o {{X1 }} documentación.

1
Jon Shier 29 jul. 2020 a las 02:49