使用令牌身份验证请求后重定向到登录页面
Redirect to Login Page after Request with Token Authentication
我有一个 Django 应用程序,其中我们有 UI 的基本 Django 视图和模板。现在我们想用 React 替换前端。对于身份验证,我们使用 TokenAuthentication
。所以,如果我理解正确的话,它应该是这样工作的:
POST
用户名和密码到您的 API 以获得令牌。
- 向您提出请求 API 并将您的 Token 添加到 header 就像
Authorization: Token 31271c25207ef084ca6e1c0af65a08d0c8f0897a
为了获得令牌,我将其添加到我的 urls.py
:
path(r"api/v1/api-token-auth/", views.obtain_auth_token, name="api_token_auth"),
在像这样发布用户名和密码后 returns 一个令牌:
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\"}"
这个returns:
{"token":"31271c25207ef084ca6e1c0af65a08d0c8f0897a"}
这很好用。
现在我想 GET
我的 REST-API 中的一些东西,但是当我尝试它时:
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",
...
]
如果需要更多信息,请告诉我。
谢谢!
好的,我明白了。
我在视图中有来自 django 而不是来自 rest_framework 的装饰器 @login_required
和 @staff_member_required
。我不得不使用 rest_framework 的许可 类 而不是 Django 的装饰器。
来自此 post 的解释和更多详细信息:
我有一个 Django 应用程序,其中我们有 UI 的基本 Django 视图和模板。现在我们想用 React 替换前端。对于身份验证,我们使用 TokenAuthentication
。所以,如果我理解正确的话,它应该是这样工作的:
POST
用户名和密码到您的 API 以获得令牌。- 向您提出请求 API 并将您的 Token 添加到 header 就像
Authorization: Token 31271c25207ef084ca6e1c0af65a08d0c8f0897a
为了获得令牌,我将其添加到我的 urls.py
:
path(r"api/v1/api-token-auth/", views.obtain_auth_token, name="api_token_auth"),
在像这样发布用户名和密码后 returns 一个令牌:
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\"}"
这个returns:
{"token":"31271c25207ef084ca6e1c0af65a08d0c8f0897a"}
这很好用。
现在我想 GET
我的 REST-API 中的一些东西,但是当我尝试它时:
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",
...
]
如果需要更多信息,请告诉我。
谢谢!
好的,我明白了。
我在视图中有来自 django 而不是来自 rest_framework 的装饰器 @login_required
和 @staff_member_required
。我不得不使用 rest_framework 的许可 类 而不是 Django 的装饰器。
来自此 post 的解释和更多详细信息: