【发布时间】:2021-12-03 15:51:29
【问题描述】:
我目前正在使用 SimpleJWT 在 Django/React 中创建登录系统。
登录后端在 React 中,它发布登录凭据并从 api 获取 JWT-Token。然后它将令牌保存到 localstorage 并将其设置为 axios 的请求标头,以供将来的 api 调用:
const handleSubmit = (e) => {
e.preventDefault();
axiosInstance
.post(`token/`, {
email: formData.email,
password: formData.password,
})
.then((res) => {
localStorage.setItem('access_token', res.data.access);
localStorage.setItem('refresh_token', res.data.refresh);
axiosInstance.defaults.headers['Authorization'] = 'JWT ' + localStorage.getItem('access_token');
history.push("");
location.reload();
}).catch(err => console.log(err));
};
api urls.py:
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
我使用 axios 进行的每个 API 调用都有效,并且只有在登录后才返回......应该是...... 但问题出在 Django 中的第二个前端。它是一个部分静态的前端,主要由主页的简单 html 模板组成,但带有一个需要用户信息的导航栏。
@api_view(['GET'])
def home(request):
print(request.header)
context = {
'posts': posts
}
return render(request, 'MainApp/home.html', context)
我注意到只是缺少身份验证标头:
-
当我登录后尝试打印用户数据时:
request.user,输出为AnonymousUser -
通过在settings.py中将默认权限设置为
isAuthenticated来保护模板视图后 像这样:'DEFAULT_PERMISSION_CLASSES' : ['rest_framework.permissions.IsAuthenticated']然后我得到401 Unauthorized/"Authentication credentials were not provided."
我还检查了request.META 并且缺少授权标头(HTTP_AUTHORIZATION)。
有没有办法从本地存储中获取 Token 并将其添加到请求标头中?我知道这是在客户端完成的,但是为什么不在这种情况下呢?
【问题讨论】:
标签: reactjs django django-rest-framework jwt django-rest-framework-simplejwt