3

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

我该怎么做呢?

4

2 回答 2

3

涵盖基本身份验证的文档在这里

这是您需要的所需零件

HTTP auth 是内置于 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
    }
  }
])
于 2017-04-28T11:02:45.877 回答
0

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

问题在于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
    }
}
于 2019-11-21T17:45:13.123 回答