Аутентификатор для SwiftGRP C in iOS? - PullRequest
0 голосов
/ 28 марта 2020

Итак, я использовал GRP C в качестве сервера для моего iOS приложения, и я использую JWT для аутентификации, но проблема в том, что я не могу обработать ответ .unauthenticated от сервера, когда JWT срок действия истекает.

Вот мой класс репозитория

class PaymentsRepository: AppRepository {

    private let client = Proto_PaymentServiceServiceClient.init(address: App.ADDRESS, secure: App.SECURE);
    static let instance = PaymentsRepository()
    private override init() {
        super.init()
        self.addAccessTokenToMetadata(client: client)
    }

    func addNewMethod(card: Proto_Card, completion: @escaping (Proto_Empty?, CallResult?) -> Void) {
        _ = try? client.addPaymentMethod(card) { (Proto_Empty, result) in
            DispatchQueue.main.async {
                if result.statusCode == .unauthenticated {
                    print("unauthenticated")
                }
                completion(Proto_Empty, result)
            }
        }
    }
}

У меня будет много func, как addNewMethod, и я не хочу ставить оператор if во всех тех, чтобы проверить unauthenticated статус.

Вот мой AppRepository (который является своего рода базовым хранилищем)

class AppRepository {

    let appClient = Proto_AppServiceServiceClient.init(address: App.ADDRESS, secure: App.SECURE);

    func refreshAccessTokens(completion: @escaping (CallResult?) -> Void) {
        var tokens = Proto_Tokens()
        tokens.refreshToken = AppUserDefaults.getRefreshToken()!
        _ = try? appClient.getNewAccessToken(tokens, completion: { (Proto_Tokens, result) in
            DispatchQueue.main.async {
                if result.statusCode == .ok && result.statusCode != .unauthenticated {
                    AppUserDefaults.setAccessToken(accessToken: tokens.accessToken)
                    AppUserDefaults.setRefreshToken(refreshToken: tokens.refreshToken)
                }
                completion(result)
            }
        })
    }

    func addAccessTokenToMetadata(client: ServiceClientBase) {
        var headers: [String: String] = client.metadata.dictionaryRepresentation
        headers["access_token"] = AppUserDefaults.getAccessToken()!
        client.metadata = try! Metadata(headers)
    }
}

Мне нужен Authenticator, который может проверять состояние unauthenticated и может получить новый токен с сервера и повторить попытку запрос с новым Tokens. Кто-нибудь может мне помочь с этим?

...