使用 Django REST Framework 进行身份验证返回 405
Posted
技术标签:
【中文标题】使用 Django REST Framework 进行身份验证返回 405【英文标题】:Authenticating with Django REST Framework returns 405 【发布时间】:2013-12-20 10:25:18 【问题描述】:我已成功设置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'
实施
控制器/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
【问题讨论】:
你能curl
到http://127.0.0.1:8000/api-token-auth/
吗(见尾部斜线)?
这意味着你只能卷曲到http://127.0.0.1:8000/api-token-auth
,而不是http://127.0.0.1:8000/api-token-auth/
。如果缺少/
,Django 通过重定向添加尾随。
如果我删除最后一个反斜杠,我会得到XMLHttpRequest cannot load http://127.0.0.1:8000/api-token-auth. The request was redirected to 'http://127.0.0.1:8000/api-token-auth/', which is disallowed for cross-origin requests that require preflight.
,值得一提的是我已经启用了CORS:CORS_ORIGIN_ALLOW_ALL = True
in settings.py
将缺少的斜杠添加到curl
URL 并显示结果。
curl http://127.0.0.1:8000/api-token-auth/
=> "detail": "Method 'GET' not allowed."%
【参考方案1】:
curl
响应与 AJAX 响应相同。 curl
响应返回 301 状态代码而不是 405,因为您使用了不同的 URL(没有尾部斜杠)。
问题是你只能POST到/api-token-auth/
URL,GET方法没有实现。
正如 Django REST 框架 API token authentication docs 所说,用例是这样的:
-
您必须将
username
和password
发布到/api-token-auth/
- 以获得身份验证令牌。
要访问需要身份验证的 URL,您必须在 Authorization HTTP 标头中包含令牌。这意味着您必须测试令牌身份验证是否适用于需要身份验证的 URL。
身份验证始终在视图的最开始运行,在权限和限制检查发生之前,以及在任何其他代码被允许继续之前。
您不必验证令牌,因为它已为您完成。如果 HTTP 标头中提供的令牌是有效的,请求将有额外的对象:
request.user 将是一个 Django 用户实例。 request.auth 将是一个 rest_framework.authtoken.models.BasicToken 实例。【讨论】:
我已经意识到了,但是我该如何解决这个问题呢? 我发现了问题:你必须使用 POST,因为 /api-token-auth/ 不处理 GET 请求。 也许我理解了一些东西,但我应该能够使用我的令牌进行身份验证,当我尝试按照我的示例所示执行此操作时,使用POST
而不是 GET
我只是得到一个400 BAD REQUEST
代替。
它的BAD REQUEST
因为你使用/api-token-auth/
来做坏事。您必须发布 username
和 password
才能获得身份验证令牌,而不是简单地将令牌添加到标头。
但是当我拥有令牌时,我应该能够发送它进行验证吗?类似于TokenAuthentication
部分中的 curl 示例?以上是关于使用 Django REST Framework 进行身份验证返回 405的主要内容,如果未能解决你的问题,请参考以下文章
Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证
18-Django REST framework-使用Django开发REST 接口
如何在 django-rest-framework 中为 API 使用 TokenAuthentication
Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers