【问题标题】:Basic Authentication with Alamofire使用 Alamofire 进行基本身份验证
【发布时间】:2016-05-31 08:50:09
【问题描述】:

在使用 Basic Auth 进行身份验证时遇到问题。我正在使用符合URLRequestConvertible 协议的标准枚举来构造我的请求。问题是当我像这样在枚举中手动设置授权标头时:

    let user = ***
    let password = ***

    let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
    let base64Credentials = credentialData.base64EncodedStringWithOptions([])

    mutableURLRequest.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")

我总是收到未经授权的 401 响应。 但是如果我像这样使用authenticate 回调设置密码:

    Alamofire.request(request)
        .authenticate(user: "USERNAME_HERE", password: "PASSWORD_HERE")
        .responseJSON { (response) -> Void in
            print("JSON response \(response)")
            completion(success: true, error: nil)
    }

它正确地进行了身份验证。我希望能够在符合URLRequestConvertible 的枚举中手动设置它,而不是在authenticate 中传递凭据。

我知道它在后台使用NSURLCredential 进行身份验证挑战,但我希望能够手动设置它。

这是我的URLRequestConvertible 实现:

enum CheckedUpAPI: URLRequestConvertible {
    static let baseURLString = "https://***"
    static let APIKey = "***"
    static let APIClientName  = "iPad"


    case UpdatePatient(String, [String: AnyObject])


    var method: Alamofire.Method {
        switch self {
        case .UpdatePatient:
            return .PATCH
        }
    }

    var path: String {
        switch self {
        case .UpdatePatient(let patientID, _):
            return "patients/\(patientID)"
        }
    }

    // MARK: URLRequestConvertible

    var URLRequest: NSMutableURLRequest {
        let URL = NSURL(string: CheckedUpAPI.baseURLString)!
        let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
        mutableURLRequest.HTTPMethod = method.rawValue


/**
        We are not setting any authorization headers since they requests return 401
        the `authenticate` function on Alamofire.request does the trick

        let user = "easy@test.com"
        let password = "test"

        let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
        let base64Credentials = credentialData.base64EncodedStringWithOptions([])

        mutableURLRequest.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
*/
        mutableURLRequest.setValue(CheckedUpAPI.APIKey, forHTTPHeaderField: "API-Key")

        switch self {
        case .UpdatePatient(_, let parameters):
            return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
        }
    }
}

【问题讨论】:

  • 请分享您如何使用 Alamofire 使用 mutableURLRequest 标头提出​​请求
  • @VictorSigler 完成。标头的手动设置已被注释掉,因为它从未起作用。但这就是我尝试过的,当使用来自Alamofireauthenticate函数时它不起作用@
  • @VictorSigler 有什么想法吗?

标签: ios swift authentication alamofire nsurlcredential


【解决方案1】:

在 swift 3.0 中

使用以下代码 -

    let user = ***
    let password = ***
    let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
    let base64Credentials = credentialData.base64EncodedString(options: [])
    let headers = ["Authorization": "Basic \(base64Credentials)"]

    Alamofire.request(customerURL,
                      method: .get,
                      parameters: nil,
                      encoding: URLEncoding.default,
                      headers:headers)
        .validate()
        .responseJSON { response in
            if response.result.value != nil{                    
               print(response)
            }else{

            }
    }

【讨论】:

    【解决方案2】:
    Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON
    

    只需验证

    【讨论】:

    • 这个答案太简单了:D
    【解决方案3】:

    你可以试试这个代码:

        let user = ***
        let password = ***
        let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
        let base64Credentials = credentialData.base64EncodedStringWithOptions([])
        let headers = ["Authorization": "Basic \(base64Credentials)"]
    
    Alamofire.manager.request(.GET, stringURL,headers: headers, parameters: params as? [String : AnyObject])
            .responseJSON { response  in
                if (response.result.error == nil){
                    success(data: response.result.value)
                }else{
                    fail(error: response.result.error)
                }
        }
    

    【讨论】:

    • 感谢耶稣,这对我帮助很大。
    • 感谢您的回复。这会起作用,但它会在整个地方乱扔我的代码。我正在努力的工作,让它在URLRequestConvertible 实现中分离所有网络内容
    • 请告诉我在上面的代码中我必须在哪里添加我的证书路径?在我的情况下,我的证书属于 NSBundle 文件夹..?如果你知道,请帮助我。
    【解决方案4】:

    斯威夫特 4

    private func getHeaders() -> [String: String] {
            let userName = "xxxx"
            let password = "xxxx"
            let credentialData = "\(userName):\(password)".data(using: .utf8)
            guard let cred = credentialData else { return ["" : ""] }
            let base64Credentials = cred.base64EncodedData(options: [])
            guard let base64Date = Data(base64Encoded: base64Credentials) else { return ["" : ""] }
            return ["Authorization": "Basic \(base64Date.base64EncodedString())"]
        }
    

    【讨论】:

    【解决方案5】:

    Alamofire 提供了一种比手动创建自己的标题更简单的方法。

    来自“基本身份验证”部分here的相关代码:

      manager.request(.GET, "https://api.parse.com/1/classes/Spot/")
        .authenticate(user: username, password: password)
        .responseSpotsArray { response in
          completionHandler(response.result)
        }
    

    【讨论】:

      【解决方案6】:

      最终找出问题所在。它最终成为 URL 中缺少的尾部正斜杠。似乎 Alamofire 并没有像 AFNetworking 那样处理它。我能够弄清楚记录请求并看到我们在实际请求中丢失了一些字节。

      【讨论】:

        猜你喜欢
        • 2015-08-12
        • 2017-06-13
        • 2013-05-30
        • 2017-10-06
        • 2013-09-14
        • 2010-12-11
        • 2016-08-24
        • 2017-08-01
        • 1970-01-01
        相关资源
        最近更新 更多