使用 Django REST Framework 进行身份验证返回 405

Jav*_*ake 6 django sencha-touch django-rest-framework

我已成功设置TokenAuthentication并生成用户在身份验证后成功接收的令牌。不幸的是,我无法将令牌毫无错误地发送到 API(DRF TokenAuthentication)。该令牌是硬编码的,用于测试,并且我正在使用 djangos 运行runserver。我从响应中看到只有POST并且OPTIONS是允许的,但我可以curl没有任何问题:

curl -X GET http://127.0.0.1:8000/api-token-auth -H 'Authorization: Token a83ff8dabb7fc7b800d381fd3994dfe2051cc0c2'
Run Code Online (Sandbox Code Playgroud)

实施

控制器/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");
    }
});
Run Code Online (Sandbox Code Playgroud)

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'),
)
Run Code Online (Sandbox Code Playgroud)

调试:

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
Run Code Online (Sandbox Code Playgroud)

nie*_*kas 6

curl响应与 AJAX 响应相同。curl响应返回 301 状态代码而不是 405,因为您使用了不同的 URL(没有尾部斜杠)。

问题是你只能POST/api-token-auth/URL,没有实现GET方法。

正如 Django REST framework API 令牌认证文档所说,用例是这样的:

  1. 你必须POSTusernamepassword/api-token-auth/-获得身份验证令牌。
  2. 要访问需要身份验证的 URL,您必须在 Authorization HTTP 标头中包含令牌。这意味着您必须测试令牌身份验证是否适用于需要身份验证的 URL。

身份验证始终在视图的最开始、权限和限制检查发生之前以及任何其他代码被允许继续之前运行。

您不必验证令牌,因为它已为您完成。如果 HTTP 标头中提供的令牌有效,则请求将具有额外的对象:

  • request.user将是一个 Django User 实例。
  • request.auth将是一个 rest_framework.authtoken.models.BasicToken 实例。

  • 我发现了问题:你必须使用 POST,因为 /api-token-auth/ 不处理 GET 请求。 (2认同)