使用令牌身份验证请求后重定向到登录页面

时间:2021-05-10 11:32:18

标签: curl django-rest-framework token

我有一个 django 应用程序,其中我们有用于 UI 的基本 django 视图和模板。现在我们想用 react 替换前端。对于身份验证,我们使用 TokenAuthentication。所以,如果我理解正确的话,它应该是这样工作的:

  1. POST 用于获取令牌的 API 的用户名和密码。
  2. 向您的 API 发出请求并将您的令牌添加到标头中,例如 Authorization: Token 31271c25207ef084ca6e1c0af65a08d0c8f0897a

为了获得令牌,我将其添加到我的 urls.py 中:

path(r"api/v1/api-token-auth/", views.obtain_auth_token, name="api_token_auth"),

在发布用户名和密码后返回一个令牌,如下所示:

curl -X POST "http://0.0.0.0:8001/api/v1/api-token-auth/" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{  \"username\": \"user-name\",  \"password\": \"S3cure-P4ssw0rd\"}"

返回:

{"token":"31271c25207ef084ca6e1c0af65a08d0c8f0897a"}

这很好用。

现在我想从我的 REST-API 中GET 一些东西,但是当我尝试它时:

curl -X GET "http://0.0.0.0:8001/api/v1/test/" -H  "accept: application/json" -H  "Authorization: Token 31271c25207ef084ca6e1c0af65a08d0c8f0897a"

它给出一个 302 并重定向到 /accounts/login/?next=/api/v1/test/,我不知道为什么。


这是一些代码:

urls.py

urlpatterns = [
    path(r"api/v1/api-token-auth/", views.obtain_auth_token, name="api_token_auth"),
    path(r"accounts/login/", auth_views.LoginView.as_view()),
    path(r"api/v1/test/", test.index_api, name="index_api"),
    ...
    path("logout/", LogoutView.as_view(), name="logout"),
]

settings.py

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"],
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework.authentication.TokenAuthentication",
        "rest_framework.authentication.SessionAuthentication",
    ),
    "TEST_REQUEST_DEFAULT_FORMAT": "json",
}
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "rest_framework.authtoken",
    ...
]

如果需要更多信息,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我想通了。

视图中的装饰器 @login_required@staff_member_required 来自 django 而不是来自 rest_framework。我不得不使用 rest_frameworks 权限类而不是 Django 的装饰器。

来自这篇文章的解释和更多细节:Token authentication in django (rest_framework) not working