gpt4 book ai didi

swift - 使用 Moya 刷新身份验证 token

转载 作者:行者123 更新时间:2023-12-03 09:24:50 53 4
gpt4 key购买 nike

我正在使用 Moya与我的 API 通信。对于我的许多端点,我要求对用户进行身份验证(即不记名 token 基于 Authorization header )。

在 Moya 文档中,here ,我找到了如何包含 Authorization header 以及不记名 token 。

但是,我现在需要实现身份验证 token 刷新,但我不确定如何执行此操作。

我找到了 this thread在 Moya 的 Github 上有一个看起来可能有帮助的答案,但我不知道将代码放在哪里。以下是答案的代码:

// (Endpoint<Target>, NSURLRequest -> Void) -> Void
static func endpointResolver<T>() -> MoyaProvider<T>.RequestClosure where T: TargetType {
return { (endpoint, closure) in
let request = endpoint.urlRequest!
request.httpShouldHandleCookies = false

if (tokenIsOK) {
// Token is valid, so just resume the request and let AccessTokenPlugin set the Authentication header
closure(.success(request))
return
}
// authenticationProvider is a MoyaProvider<Authentication> for example
authenticationProvider.request(.refreshToken(params)) { result in
switch result {
case .success(let response):
self.token = response.mapJSON()["token"]
closure(.success(request)) // This line will "resume" the actual request, and then you can use AccessTokenPlugin to set the Authentication header
case .failure(let error):
closure(.failure(error)) //something went terrible wrong! Request will not be performed
}
}
}
}

这是我的 Moya 提供者的类(class):
import Foundation
import Moya

enum ApiService {
case signIn(email: String, password: String)
case like(id: Int, type: String)
}

extension ApiService: TargetType, AccessTokenAuthorizable {
var authorizationType: AuthorizationType {
switch self {
case .signIn(_, _):
return .basic
case .like(_, _):
return .bearer
}
}

var baseURL: URL {
return URL(string: Constants.apiUrl)!
}

var path: String {
switch self {
case .signIn(_, _):
return "user/signin"
case .like(_, _):
return "message/like"
}
}

var method: Moya.Method {
switch self {
case .signIn, .like:
return .post
}
}

var task: Task {
switch self {
case let .signIn(email, password):
return .requestParameters(parameters: ["email": email, "password": password], encoding: JSONEncoding.default)
case let .like(id, type):
return .requestParameters(parameters: ["messageId": id, "type": type], encoding: JSONEncoding.default)
}
}

var sampleData: Data {
return Data()
}

var headers: [String: String]? {
return ["Content-type": "application/json"]
}
}

private extension String {
var urlEscaped: String {
return addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
}

var utf8Encoded: Data {
return data(using: .utf8)!
}
}


我会将答案的代码放在我的代码中的什么位置?我错过了什么吗?

最佳答案

实际上,这个例子有点老了。所以这是一个新的:

extension MoyaProvider {
convenience init(handleRefreshToken: Bool) {
if handleRefreshToken {
self.init(requestClosure: MoyaProvider.endpointResolver())
} else {
self.init()
}
}

static func endpointResolver() -> MoyaProvider<Target>.RequestClosure {
return { (endpoint, closure) in
//Getting the original request
let request = try! endpoint.urlRequest()

//assume you have saved the existing token somewhere
if (#tokenIsNotExpired#) {
// Token is valid, so just resume the original request
closure(.success(request))
return
}

//Do a request to refresh the authtoken based on refreshToken
authenticationProvider.request(.refreshToken(params)) { result in
switch result {
case .success(let response):
let token = response.mapJSON()["token"]
let newRefreshToken = response.mapJSON()["refreshToken"]
//overwrite your old token with the new token
//overwrite your old refreshToken with the new refresh token

closure(.success(request)) // This line will "resume" the actual request, and then you can use AccessTokenPlugin to set the Authentication header
case .failure(let error):
closure(.failure(error)) //something went terrible wrong! Request will not be performed
}
}
}
}

用法:
public var provider: MoyaProvider<SomeTargetType> = MoyaProvider(handleRefreshToken: true)

provider.request(...)

关于swift - 使用 Moya 刷新身份验证 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54936080/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com