我正在使用django rest框架为apis开发iOS应用程序。但是目前我在使用身份验证凭据调用apis时无法取得进展。
我成功地使用Postman调用api并将Header设置为Authentication Bearer <token>
但是我仍然无法通过iOS应用程序调用它。我正在使用Moya
来调用api。我不知道接下来该做什么。
我尝试了什么:(在调用Moya时)
let token = "abcde12345sometoken"
let plugin = AccessTokenPlugin(tokenClosure: token)
let provider = MoyaProvider<AccountAPI>(plugins : [plugin])
provider.request(.getAccountProfile(oauth_id: oauth_id, provider: "facebook")) { (result) in
// doing something with result
}
并将API配置为:
extension AccountAPI : TargetType, AccessTokenAuthorizable {
// codes conforming variables to TargetType protocol
public var authorizationType: AuthorizationType {
switch self {
case .getFacebookAccountToken:
return .none
default:
return .bearer
}
}
public var headers: [String: String]? {
switch self {
case .getFacebookAccountToken, .getEmailAccountToken: // post requests
return ["Content-type":"application/x-www-form-urlencoded"]
default:
return ["Content-type":"application/json"]
}
}
}
使用Moya进行身份验证或使用Info.plist等时,我应该考虑什么? 或者文档说这种方法适用于JWT令牌,也许我的方法不适用于JWT和其他东西..?给我一些建议!
答案 0 :(得分:1)
对于我来说,我使用
Moya
12.0.1
MultiTarget
示例:
plugins = [AccessTokenPlugin(tokenClosure: {
let token = ...
return token
})]
MoyaProvider<MultiTarget>(
plugins: plugins
)
.request(MultiTarget(myAPI)) {
...
}
但是它从不调用tokenClosure
解决方案 您需要添加此扩展名
extension MultiTarget: AccessTokenAuthorizable {
public var authorizationType: AuthorizationType {
guard let target = target as? AccessTokenAuthorizable else { return .none }
return target.authorizationType
}
}
来源:https://github.com/Moya/Moya/blob/master/Sources/Moya/Plugins/AccessTokenPlugin.swift#L62
答案 1 :(得分:0)
经过几个小时的尝试之后......我发现api端点是基于内容语言重定向的。所以我设置的标头在被重定向时已经死了。因此,提前设置i18n网址或设置内容语言标题可以解决我的问题。