Po uwierzytelnianiu użytkownika z FireBase otrzymuję token ID, ponieważ moja usługa odpoczynku używa żetonu FireBase do uwierzytelniania.

Po stronie IOS chcę przechowywać ten token, aby każda prośba, którą wykonam, będzie miał nagłówek autoryzacji z tokenem.

Alamofire Doc sugeruje korzystanie z prośbąDAdapter https://github.com/ Alamofire / Alamofire / Blob / Master / Dokumentacja / AdvancedSage.md # Requestadapter

Robię tookenceptora:

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))
    }
}

Wtedy chcę go użyć, ale nie rozumiem, jak używać tego z AF lub Session. Oto moja klasa stanowa:

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 lipiec 2020, 23:19

1 odpowiedź

Najlepsza odpowiedź

Możesz użyć RequestAdapter na PER - {X1}} lub PER - Request. Session Initiator może podjąć wartość, która jest następnie wykorzystywana dla wszystkich żądań:

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

Albo możesz go ustawić na żądanie:

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

Możesz przeczytać więcej w naszej {{x0} } Dokumentacja lub {{X1 }} Dokumentacja.

1
Jon Shier 29 lipiec 2020, 02:49