Moya - 无法使用身份验证凭据调用 api

Posted

技术标签:

【中文标题】Moya - 无法使用身份验证凭据调用 api【英文标题】:Moya - unable to call apis with authentication credentials 【发布时间】:2017-09-22 02:54:53 【问题描述】:

我正在使用 django rest 框架为 api 开发一个 ios 应用程序。但目前我无法在使用身份验证凭据调用 api 时取得成功。

我通过将 Header 设置为 Authentication Bearer <token>.. 成功地使用 Postman 和 curl 调用了 api,但我一直无法从 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 和其他东西..?给我一些建议!

【问题讨论】:

您的标头变量是什么样的?它真的会覆盖标题吗? 我编辑了添加标头变量的问题,我认为我应该在需要时添加 Accept-Language 标头。有什么建议吗? 这很奇怪。所以你的 API 中的标头不会覆盖你的插件? 不,我没有覆盖插件。。我认为是api服务器的问题,它在没有语言代码uri的情况下重定向请求,并且在此过程中可能会出现一些错误 【参考方案1】:

就我而言,我使用

Moya12.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

【讨论】:

【参考方案2】:

经过几个小时的尝试,我发现它是 api 端点根据内容语言重定向自身。所以我设置的标头在重定向时已失效。所以无论是提前设置 i18n url 还是设置 content-language 标头都可以解决我的问题。

【讨论】:

以上是关于Moya - 无法使用身份验证凭据调用 api的主要内容,如果未能解决你的问题,请参考以下文章

即使凭据为真,Spring Boot Security 也会在 API 调用上引发 401 身份验证错误

Google Analytics API - 通过身份验证后无法添加服务

错误域 = MCOErrorDomain 代码 = 5 “无法使用当前会话的凭据进行身份验证。”

如何将 Windows 身份验证凭据从客户端传递到 Web API 服务

Django Rest Framework JWT 未提供身份验证凭据

Symfony 5 / 使用 API 编写自定义身份验证总是返回我无效的凭据