文档展示了如何使目标需要承载令牌,我就是这样做的。
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响应(这意味着我没有被授权),它会自动请求一个令牌?
发布于 2018-02-09 19:46:19
对于每个API,身份验证/授权的实现细节可能非常不同。这就是为什么Moya不会为您处理auth的原因。
也就是说,可以通过多种方式实现您自己的身份验证/授权。它将取决于您的约束和/或首选项。到目前为止,您可以在Moya文件中找到一些稀疏概述的解决方案。
PluginType将auth添加到请求中。但是,如果需要的话,可以使用它来刷新令牌。您还可能需要拦截请求的完成,以检测授权错误并应用您首选的恢复方案(例如。刷新令牌并重试调用)。endpointClosure和/或requestClosure实现。Alamofire的RequestAdapter和RequestRetrier。根据您的需要,这可以使重试更容易。然而,在它们上您将无法直接访问TargetType,因此您可能需要找到一种方法来识别所需的不同的auth方法(即bearer或none)。有几处直接提到它们的文件:
此外,我强烈鼓励任何人从源代码中学习/获得灵感。
发布于 2018-09-02 07:20:14
对于更改/刷新令牌,我使用了以下方法
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
}https://stackoverflow.com/questions/48649453
复制相似问题