文档显示了如何使目标需要承载令牌,我这样做了

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响应(意味着我没有被授权),它会自动请求一个令牌?

最佳答案

对于每个API,身份验证/授权的实现细节可能会大不相同。这就是Moya不会为您处理身份验证的原因。
也就是说,可以通过多种方式实现您自己的身份验证/授权。这将取决于您的约束和/或偏好。从今天起,您可以找到一些在Moya documentation中略述的解决方案:
使用PluginType将您的身份验证添加到请求中。但如果需要的话,可以使用它来刷新令牌。您可能还需要拦截请求的完成以检测授权错误并应用首选恢复方案(例如,刷新令牌并重试调用)。
也可以使用endpointClosure和/或requestClosure来实现。
您还可以考虑实现AlamofireRequestAdapterRequestRetrier。根据您的需要,这可以使重试更容易。但是,在它们上,您无法直接访问您的TargetType,因此您可能需要找到一种方法来识别所需的不同身份验证方法(即您的bearernone)。
直接引用他们的文档:
Plugins
Endpoints
Authentication
Alamofire Automatic Validation
此外,我强烈鼓励任何人从Eilodon's Networking source code中学习/获得灵感。

08-29 01:18