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

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

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

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


person naif    schedule 06.02.2018    source источник


Ответы (2)


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

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

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

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

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

person fbeeper    schedule 09.02.2018

для изменения / обновления токена я использовал это

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()
                                throw error
                            }
                            .flatMap({ (newAccessToken) -> PrimitiveSequence<SingleTrait, String> in
                                changeAccessToken()
                                return Single.just(newAccessToken)
                            })
                    }
            }
            throw error
        })
    })
}

static func logout() {
    // logout action
}

static func changeAccessToken() {
   // set new access token
}
person kumara    schedule 02.09.2018