我有一个使用Django REST Framework(DRF)编写的应用程序。 此外,还有这样的注册端点:
from refreshtoken.views import delegate_jwt_token
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('api-token-auth/', obtain_jwt_token),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path(r'refresh-token', delegate_jwt_token, name='refresh-token'),
]
此外,还有一些端点需要授权。
因此,我正在尝试使用curl
客户端提取令牌:
curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api-token-auth/ -d '{"username": "test", "password": "testpassword"}'
它返回如下内容:
{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYTdlMmIyMjItZTZkNy00NjhiLTkxNzYtOTE2YzAwZWRhY2E2IiwidXNlcm5hbWUiOiJ0ZXN0IiwiZXhwIjoxNTUwNTEwNDAwLCJlbWFpbCI6InRlc3RAZHhhbXBsZS5jb20iLCJpc19zdGFmZiI6ZmFsc2UsImdyb3VwcyI6W10sInN1YnNjcmliZWQiOmZhbHNlLCJ0ZWxlZ3JhbV9zdWJzY3JpYmVkIjpmYWxzZX0.OExR9TlO3GUisYAu_D86CJ6hgF1EcofpQA0MZ1ENT2c","refresh_token":"1ab03e609d7a7ae05ce104c73858a346a0438e72"}
然后,使用我要登录的令牌,使用令牌:
curl -X POST -H "Authorization: JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYTdlMmIyMjItZTZkNy00NjhiLTkxNzYtOTE2YzAwZWRhY2E2IiwidXNlcm5hbWUiOiJ0ZXN0IiwiZXhwIjoxNTUwNTEwNDAwLCJlbWFpbCI6InRlc3RAZHhhbXBsZS5jb20iLCJpc19zdGFmZiI6ZmFsc2UsImdyb3VwcyI6W10sInN1YnNjcmliZWQiOmZhbHNlLCJ0ZWxlZ3JhbV9zdWJzY3JpYmVkIjpmYWxzZX0.OExR9TlO3GUisYAu_D86CJ6hgF1EcofpQA0MZ1ENT2c" -H "Content-Type: application/json" http://127.0.0.1:8000/api-auth/login/ -d '{"username": "test", "password": "testpassword"}'
它返回403 (Forbidden)
CSRF验证失败。请求中止。
为什么我做错了?
一个有趣的地方:
每个请求令牌的请求都会为同一个user:password对返回一个新令牌(是预期的还是我的令牌过期太快)?
答案 0 :(得分:1)
一旦有了令牌,就不需要像尝试那样传递登录凭据或转到登录URL时,令牌将提供身份验证。尝试像docs示例中那样访问受保护的URL:
现在,要访问受保护的api网址,您必须添加 授权:JWT标头。
$ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
确保像在文档中一样将'rest_framework_jwt.authentication.JSONWebTokenAuthentication'
添加到'DEFAULT_AUTHENTICATION_CLASSES'
。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
关于最后一个问题:
每个请求令牌的请求都会为同一个user:password对返回一个新令牌(是预期的还是我的令牌过期太快)?
这是预料之中的,每次调用/api-token-auth/
时都会生成一个新的。默认到期时间为5分钟,您可以使用JWT_EXPIRATION_DELTA
在设置中进行更改。选中additional settings。