如何在 Moya 中设置基本的 auth 用户名和密码?

Posted

技术标签:

【中文标题】如何在 Moya 中设置基本的 auth 用户名和密码?【英文标题】:How to set basic auth username and password in Moya? 【发布时间】:2017-04-28 10:53:03 【问题描述】:

我已经从 UITextField 检索到用户名和密码,现在我想为 Moya 使用基本身份验证执行的每个请求设置用户名和密码。

我该怎么做?

【问题讨论】:

我找不到足够的文档来解决这个特殊问题 【参考方案1】:

涵盖基本身份验证的文档是here

这里是您需要的部件

HTTP 身份验证是内置于 HTTP 协议本身的用户名/密码质询。如果您需要使用 HTTP 身份验证,您可以在初始化您的提供者时提供一个 CredentialsPlugin。

let provider = MoyaProvider<YourAPI>(plugins: [CredentialsPlugin  _ -> URLCredential? in
    return URLCredential(user: "user", password: "passwd", persistence: .none)
  
])

此特定示例显示了使用 HTTP 对每个请求进行身份验证,这通常不是必需的。这可能是一个更好的主意:

let provider = MoyaProvider<YourAPI>(plugins: [CredentialsPlugin  target -> URLCredential? in
    switch target 
      case .targetThatNeedsAuthentication:
        return URLCredential(user: "user", password: "passwd", persistence: .none)
      default:
        return nil
    
  
])

【讨论】:

有没有办法将这个设置为每个Provider 或者我真的需要为应用程序需要的每个Provider 编写这个代码? 根据我的经验,大多数应用每个 API 只有一个提供者,在我开发的每个应用中,我们只有一个主提供者。你应该可以动态设置它......但我害怕我不熟悉【参考方案2】:

这个解决方案对我不起作用。

问题在于URLCredential 仅用于身份验证挑战,而不用于对请求进行预授权。因此,如果您的 API 需要带有 Base64 "username:password" 参数的 Authorization 标头,这将不起作用。关于它的工作原理似乎有很多困惑,请参阅Alamofire 上的类似问题。

我通过以下方式解决了这个问题:

解决方案 1

lazy var provider: MoyaProvider<LoginService> = 
    let endpointClosure =  (target: LoginService) -> Endpoint<LoginService> in
      let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)

      switch target 
      case .login(let username, let password):
        return defaultEndpoint.adding(newHTTPHeaderFields: ["Authorization": "Basic " + "\(username):\(password)".data(using: .nonLossyASCII)!.base64EncodedString(options: []))
      
    

    return MoyaProvider(endpointClosure: endpointClosure)
()

这是使用 Moya 插件方法的其他解决方案:

解决方案 2

class AuthProvider 

    static let basicAuthPlugin: PluginType = AccessTokenPlugin(tokenClosure:  () -> String in
        guard let loginData = String(format: "\("username"):\("password")").data(using: .utf8) else  return "" 
        return loginData.base64EncodedString()
    )


let AuthAPIProvider = MoyaProvider<AuthAPI>(plugins: [AuthProvider.basicAuthPlugin])

enum AuthAPI 
    // ... methods


extension AuthAPI: AccessTokenAuthorizable 
    var authorizationType: AuthorizationType 
        return .basic
    

【讨论】:

以上是关于如何在 Moya 中设置基本的 auth 用户名和密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 1:m 关系中设置默认值,Django 中 user_auth_model 的外键

如何在 Vuejs 和 Node 中设置授权标头并保护路由

如何使用 on_delete 属性在用户模型的外键字段中设置用户全名?

如何在 Vue 中设置身份验证状态更改?

如何在 nuxt/axios 中设置 baseUrl?

如何在 Spring Boot 中设置基于预认证头的认证?