Как я могу изменить токен на предъявителя в Мойе

Документация показывает, как сделать так, чтобы цели требовали токенов на предъявителя, что я и сделал

extension MyService: AccessTokenAuthorizable {
    var authorizationType: AuthorizationType {
        switch self {
        case .resetPassword, .postTextBook, .bookmarkBook, .getBookmarks, .logout, .verify:
            return .bearer
        default:
            return .none
        }
    }
}

Затем он показывает, как добавить токены для провайдеров, что я и сделал, как это

let token = "abc123"
let authPlugin = AccessTokenPlugin(tokenClosure: token)
let provider = MoyaProvider<MyService>(plugins: [authPlugin])

но когда токен истекает, как я могу изменить токен? и предлагает ли Мойя способ автоматизации этого процесса, где, если я получаю запрещенный HTTP-ответ (то есть я не авторизован), он автоматически запрашивает токен?

2 ответа

Решение

Детали реализации аутентификации / авторизации могут быть разными для каждого API. Это причина, почему Moya не будет обрабатывать аутентификацию для вас.

Тем не менее, реализация вашей собственной аутентификации / авторизации может быть выполнена разными способами. Это будет зависеть от ваших ограничений и / или предпочтений. На сегодняшний день вы можете найти несколько решений, в общих чертах изложенных в документации Moya:

  • Использовать PluginType добавить свой запрос к запросам. Но подумайте, что это может потенциально использоваться для обновления токена, если это необходимо. Вам также может потребоваться перехватить завершение запроса, чтобы обнаружить ошибки авторизации и применить предпочитаемый сценарий восстановления (например, обновить токен и повторить вызов).
  • То же самое можно реализовать с помощью endpointClosure и / или requestClosure,
  • Вы также можете рассмотреть возможность реализации Alamofire "s RequestAdapter а также RequestRetrier, В зависимости от ваших потребностей, это может облегчить повторные попытки. Тем не менее, на них у вас не будет прямого доступа к вашему TargetType, так что вам может понадобиться найти способ распознавать различные необходимые методы аутентификации (т.е. ваш bearer или же none).

Несколько прямых ссылок на их документацию:

Кроме того, я настоятельно рекомендую всем учиться / получать вдохновение от Eilodon's Networking исходный код

static func send(request: TargetType) -> PrimitiveSequence<SingleTrait, Response> {
return provider.rx.request(request)
    .retry(1)
    .observeOn(ConcurrentDispatchQueueScheduler.init(qos: .default))
    .filterSuccessfulStatusAndRedirectCodes()
    .retryWhen({ (errorObservable: Observable<Error>) in
        errorObservable.flatMap({ (error) -> Single<String> in
            if let moyaError: MoyaError = error as? MoyaError, let response: Response = moyaError.response {
                    if **check forbidden http responses here** {
                        return provider.rx.request(.refreshToken(*your refresh token here*))
                            .filterSuccessfulStatusCodes()
                            .mapString(atKeyPath: "*json path to new access token*")
                            .catchError { (_) in
                                *Logout because getting new access token failed*
                                throw error
                            }
                            .flatMap({ (newAccessToken) -> PrimitiveSequence<SingleTrait, String> in
                                *set & save new access token*
                                return Single.just(newAccessToken)
                            })
                    }
            }
            throw error
        })
    })
}
Другие вопросы по тегам