Итак, я использовал 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
. Кто-нибудь может мне помочь с этим?