【发布时间】:2018-06-22 16:08:10
【问题描述】:
我是 django rest api 框架的新手。我正在为其余 api 使用基于 JWT 令牌的身份验证,并具有以下设置 -
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
AND
JWT_AUTH = {
'JWT_ENCODE_HANDLER':
'rest_framework_jwt.utils.jwt_encode_handler',
'JWT_DECODE_HANDLER':
'rest_framework_jwt.utils.jwt_decode_handler',
'JWT_PAYLOAD_HANDLER':
'rest_framework_jwt.utils.jwt_payload_handler',
'JWT_PAYLOAD_GET_USER_ID_HANDLER':
'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
'JWT_RESPONSE_PAYLOAD_HANDLER':
'rest_framework_jwt.utils.jwt_response_payload_handler',
'JWT_SECRET_KEY': SECRET_KEY,
'JWT_GET_USER_SECRET_KEY': None,
'JWT_PUBLIC_KEY': None,
'JWT_PRIVATE_KEY': None,
'JWT_ALGORITHM': 'HS256',
'JWT_VERIFY': True,
'JWT_VERIFY_EXPIRATION': True,
'JWT_LEEWAY': 0,
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_AUDIENCE': None,
'JWT_ISSUER': None,
'JWT_ALLOW_REFRESH': True,
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
'JWT_AUTH_HEADER_PREFIX': ('JWT','Bearer'),
'JWT_AUTH_COOKIE': None,
}
现在基于此,我在 chrome 中使用了 postman 插件,并尝试使用以下步骤测试我的 web api 进行身份验证 -
我使用带有凭据的 url http://127.0.0.1:8000/webs/auth-jwt/ 来获取令牌。
我使用了 url http://127.0.0.1:8000/webs/testspsearch/ 并将步骤 1 中生成的令牌作为 Authorization Bearer 传递。这被定义为 POST 方法
但是当我这样做时,我得到了错误 -> CSRF 验证失败。请求中止。 HTTP 403 错误。
你能告诉我我在这方面做错了什么吗?
【问题讨论】:
-
请记住,如果您从“127.0.0.1:8000”以外的任何地方向您的 api 发送请求,则(同源策略)[en.wikipedia.org/wiki/Same_origin_policy] 将生效并阻止请求(标准 CSRF 端口)。请注意,即使是在 localhost 但在不同端口上运行的 Web 前端也会被视为不同的来源。您需要启用 CORS 才能使其正常工作,例如下面提到的 @Muhammad Hassan。
标签: django authentication django-rest-framework jwt