2016-03-11 2 views
2

Я использую django-reat-framework как бэкэнд и используя SessionAuthentication и TokenAuthentication. Эта работа хорошо, когда я использую httpie Послать запросCSRF Сбой при использовании данных POST с использованием Alamofire

http POST http://127.0.0.1:8000/api/users/ email="[email protected]" user_name="abc" passwod="1234"

, но когда я использую Alamofire

Alamofire.request(.POST, "http://127.0.0.1:8000/api/users/", parameters: ["email": emailField.text!, "user_name": usernameField.text!, "password": passwordField.text!], encoding: .URL) 
      .responseJSON { response in 
       print(response.request) // original URL request 
       print(response.response) // URL response 
       print(response.data)  // server data 
       print(response.result) 
       if let JSON = response.result.value { 
        print("JSON: \(JSON)") 
       } 
     } 

возвращение этого

Optional(<NSMutableURLRequest: 0x7fe24e15d640> { URL: http://127.0.0.1:8000/api/users/ }) 
Optional(<NSHTTPURLResponse: 0x7fe24bf3a080> { URL: http://127.0.0.1:8000/api/users/ } { status code: 403, headers { 
    Allow = "GET, POST, HEAD, OPTIONS"; 
    "Content-Type" = "application/json"; 
    Date = "Fri, 11 Mar 2016 13:09:59 GMT"; 
    Server = "WSGIServer/0.2 CPython/3.4.3"; 
    Vary = "Accept, Cookie"; 
    "X-Frame-Options" = SAMEORIGIN; 
} }) 
Optional(<7b226465 7461696c 223a2243 53524620 4661696c 65643a20 43535246 20746f6b 656e206d 69737369 6e67206f 7220696e 636f7272 6563742e 227d>) 
SUCCESS 
JSON: { 
    detail = "CSRF Failed: CSRF token missing or incorrect."; 
} 

Но 127.0.0.1:8000/api/users/не нужно никакого разрешения, и я не отправил токен csrf, когда я использую httpie.So, что здесь не так?

ответ

1

Запросы POST/DELETE API, созданные с использованием Django, должны иметь действительный csrftoken, который будет передан вместе с запросом.

Вам необходимо сгенерировать токен перед выполнением любых POST-вызовов. Чтобы создать маркер, пожалуйста, обратитесь к https://docs.djangoproject.com/en/1.9/ref/csrf/

Кроме того, после получения csrftoken значения из печенья, передать маркер в заголовке запроса

 let headers = [ "Accept":"application/json" , "Content-Type": "application/json" , "X-CSRFToken" : csrftoken] 


     Alamofire.request(.POST, "http://127.0.0.1:8000/api/users/", headers: headers, parameters: params, encoding: .JSON) 
      .validate() 
      .responseJSON { response in 

       switch response.result { 
       case .Success(let responseContent): 
+0

Можете ли вы предоставить свое решение для создания маркеров? – Domsware

0

Взлет SessionAuthentication из authentication_classes в соответствующий вид API. Он отключит файлы cookie для этого вида, что означает, что CSRF-токен больше не требуется..

1

Этот заголовок работал для меня:

let headers = [ 
    "Cookie": "" 
] 


Alamofire.request(urlString, method: .post, parameters: ["username": username!, "password": password!],encoding: JSONEncoding.default, headers: headers).responseJSON { 
    response in 
    switch response.result { 
      case .success: 
       print(response)      
       break 
      case .failure(let error): 
       print(error) 
    } 

} 

Отсюда: https://github.com/Alamofire/Alamofire/issues/646

Смежные вопросы