Базовая аутентификация с помощью Alamofire

возникает проблема при аутентификации с помощью 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 под капотом для задач auth, но я хотел бы иметь возможность установить его вручную.

вот мой 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
        }
    }
}

5 ответов


в 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{

            }
    }

вы можете попробовать этот код:

    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)
            }
    }

Alamofire.request(urlString, method: .get).authenticate(user: "username", password: "pwd").responseJSON

просто аутентифицировать


в конечном итоге выяснил, в чем проблема. Это закончилось тем, что отсутствовала косая черта в URL-адресе. Похоже, Alamofire не обрабатывает его так же, как AFNetworking. Я смог понять это, регистрируя запросы и видя, что мы теряем некоторые байты в фактическом запросе.


Alamofire обеспечивает еще более простой подход, чем ручное создание собственных заголовков.

соответствующий фрагмент кода из раздела "Basic Auth"здесь:

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