首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能在莫亚更换持票人?

我怎样才能在莫亚更换持票人?
EN

Stack Overflow用户
提问于 2018-02-06 18:16:44
回答 2查看 4K关注 0票数 0

文档展示了如何使目标需要承载令牌,我就是这样做的。

代码语言:javascript
复制
extension MyService: AccessTokenAuthorizable {
    var authorizationType: AuthorizationType {
        switch self {
        case .resetPassword, .postTextBook, .bookmarkBook, .getBookmarks, .logout, .verify:
            return .bearer
        default:
            return .none
        }
    }
}

然后展示了如何向提供程序添加令牌,我就是这样做的

代码语言:javascript
复制
let token = "abc123"
let authPlugin = AccessTokenPlugin(tokenClosure: token)
let provider = MoyaProvider<MyService>(plugins: [authPlugin])

但是,当令牌过期时,我如何更改令牌?Moya提供了一种自动化这个过程的方法吗?如果我得到一个被禁止的http响应(这意味着我没有被授权),它会自动请求一个令牌?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-09 19:46:19

对于每个API,身份验证/授权的实现细节可能非常不同。这就是为什么Moya不会为您处理auth的原因。

也就是说,可以通过多种方式实现您自己的身份验证/授权。它将取决于您的约束和/或首选项。到目前为止,您可以在Moya文件中找到一些稀疏概述的解决方案。

  • 使用PluginType将auth添加到请求中。但是,如果需要的话,可以使用它来刷新令牌。您还可能需要拦截请求的完成,以检测授权错误并应用您首选的恢复方案(例如。刷新令牌并重试调用)。
  • 同样可以使用endpointClosure和/或requestClosure实现。
  • 您还可以考虑实现AlamofireRequestAdapterRequestRetrier。根据您的需要,这可以使重试更容易。然而,在它们上您将无法直接访问TargetType,因此您可能需要找到一种方法来识别所需的不同的auth方法(即bearernone)。

有几处直接提到它们的文件:

此外,我强烈鼓励任何人从源代码中学习/获得灵感。

票数 2
EN

Stack Overflow用户

发布于 2018-09-02 07:20:14

对于更改/刷新令牌,我使用了以下方法

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48649453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档