2013-12-20 7 views
4

Я успешно установил TokenAuthentication и сгенерировал токены, которые были успешно получены пользователем после аутентификации. К сожалению, я не могу отправить токен в API без ошибок (DRF TokenAuthentication). Токен жестко запрограммирован для тестирования и им работает с djangos runserver. Я вижу из ответа, что только POST и OPTIONS разрешено, но я могу curl без каких-либо проблем:Проверка подлинности с помощью Django REST Framework возвращает 405

curl -X GET http://127.0.0.1:8000/api-token-auth -H 'Authorization: Token a83ff8dabb7fc7b800d381fd3994dfe2051cc0c2' 

Реализация

Контроллер/Login.js:

reSignInCommand: function (aToken) { 
    var me = this; 

Ext.Ajax.request({ 
    url: 'http://127.0.0.1:8000/api-token-auth/', 
    method: 'GET', 
    disableCaching: false, 
    timeout: 10000, 
    useDefaultXhrHeader: false, 
    headers: { 
     'Authorization' : 'Token a83ff8dabb7fc7b800d381fd3994dfe2051cc0c2' 
    }, 
    success: function(response) { 
     console.log("success"); 
    }, 
    failure: function(response) { 
     console.log("failure"); 
    } 
}); 

API /urls.py:

from django.conf.urls import patterns, url, include 

urlpatterns += patterns('', 
    url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'), 
) 

отладки:

Request URL:http://127.0.0.1:8000/api-token-auth/ 
Request Method:GET 
Status Code:405 METHOD NOT ALLOWED 

Request headers: 
Accept:*/* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:da,zh;q=0.8,de;q=0.6,en;q=0.4 
Authorization:Token a83ff8dabb7fc7b800d381fd3994dfe2051cc0c2 
Cache-Control:no-cache 
Connection:keep-alive 
Host:127.0.0.1:8000 
Origin:http://127.0.0.1 
Pragma:no-cache 
Referer:http://127.0.0.1/sencha/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 

Response headers: 
HTTP/1.0 405 METHOD NOT ALLOWED 
Date: Fri, 20 Dec 2013 10:19:50 GMT 
Server: WSGIServer/0.1 Python/2.7.5 
Vary: Accept, Cookie 
Access-Control-Allow-Origin: * 
Content-Type: application/json 
X-Frame-Options: SAMEORIGIN 
Allow: POST, OPTIONS 
+0

Можете ли вы '' завивать' '' http: //127.0.0.1: 8000/api-token-auth/'' (см. Конечную косую черту)? – niekas

+0

Это означает, что вы можете зависать только до '' http: //127.0.0.1: 8000/api-token-auth'', а не '' http: //127.0.0.1: 8000/api-token-auth/' '. Django добавляет trailing ''/'' через перенаправление, если его отсутствует. – niekas

+0

Если я удалю последнюю обратную косую черту, я получаю 'XMLHttpRequest не могу загрузить http://127.0.0.1:8000/api-token-auth. Запрос был перенаправлен на «http: //127.0.0.1: 8000/api-токен-auth/', который запрещен для запросов с кросс-началом, которые требуют предварительной проверки. 'его стоит упомянуть, что я включил CORS:' CORS_ORIGIN_ALLOW_ALL = True' в 'settings.py' – JavaCake

ответ

4

curl ответ такой же, как ответ AJAX. curl ответ ответил 301 кодом статуса вместо 405, потому что вы использовали другой URL (у которого не было конечной косой черты).

Проблема заключается в том, что вы можете только POST в /api-token-auth/ URL, GET метод не реализован.

В рамках Django REST API token authentication docs говорят, использование случая заключается в следующем:

  1. Вы должны POST username и password в /api-token-auth/ - для получения маркера аутентификации.
  2. Для доступа к URL-адресу, для которого требуется аутентификация, вы должны включить токен в HTTP-заголовок авторизации. Это означает, что вам нужно проверить, работает ли токен-аутентификация на URL-адресе, который требует аутентификации.

аутентификация всегда выполняется в самом начале представления, до разрешения и дроссельные проверки происходят, и перед любой другой код протекала.

Вам не нужно проверять токен, потому что это сделано для вас. Если маркер, предоставленный в заголовке HTTP действителен запрос будет иметь дополнительные объекты:

  • request.user будет экземпляр пользователя Django.
  • request.auth будет объектом rest_framework.authtoken.models.basicToken.
+0

Я понял это, но как это сделать Я решаю проблему? – JavaCake

+1

Я нашел проблему: вы должны использовать POST, потому что/api-token-auth/не обрабатывает запросы GET. – niekas

+0

Возможно, я что-то понимаю, но я должен иметь возможность аутентифицироваться с помощью своего токена, когда я пытаюсь сделать это, как показано в моем примере, с помощью 'POST' вместо' GET', я просто получаю '400 BAD REQUEST'. – JavaCake

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