使用Django Rest框架的JWT令牌身份验证
我在使用react本机前端的Django Rest应用程序上遇到了一些令牌身份验证问题。我一直使用会话身份验证,这是我第一次使用这些需求设置项目 我安装了pip-使用Django Rest框架的JWT令牌身份验证,django,django-rest-framework,jwt,axios,Django,Django Rest Framework,Jwt,Axios,我在使用react本机前端的Django Rest应用程序上遇到了一些令牌身份验证问题。我一直使用会话身份验证,这是我第一次使用这些需求设置项目 我安装了pip- djangorestframework\u simplejwt 当我点击端点api/token 我可以在前端取回它们。我的问题发生在我尝试在后端点击列表路由时,返回的错误如下 { "detail": "Authentication credentials were not provided." } 我认为这可能是cors的问
djangorestframework\u simplejwt
当我点击端点api/token
我可以在前端取回它们。我的问题发生在我尝试在后端点击列表路由时,返回的错误如下
{
"detail": "Authentication credentials were not provided."
}
我认为这可能是cors的问题,或者是我的axios请求的问题,但我相当确定它们的设置是正确的。另一个问题是我的视图集中的身份验证和权限类,我的直觉告诉我这个问题的根源
相关设置.py信息--
Viewset/Serializer/Url
class WorkoutViewSet(ModelViewSet):
model = apps.get_model('backend', 'Workout')
queryset = model.objects.all()
serializer_class = serializers.WorkoutSerializer
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
class WorkoutSerializer(serializers.ModelSerializer):
class Meta:
model = apps.get_model('backend', 'Workout')
fields = ('name', 'is_complete', 'allow_copy', 'workout_goal', 'user')
router.register(r'workouts', views.WorkoutViewSet, base_name='workouts')
Axios请求
export const workouts = (token) => {
return axios({
method: 'get',
url: 'http://localhost:8000/workouts',
headers: { 'authorization': `Bearer ${token}`}
})
}
感谢您的帮助/指导。在您的视图集中,您已经指定了用于设置令牌身份验证的身份验证类 这意味着,对于您的工作视图集,您指定仅使用令牌身份验证-它在标题中使用令牌前缀,因此您将获得“未提供凭据”
如果您想使用JWT令牌身份验证-您应该在此处显式设置它,或者删除它,并让默认选择的类在您的视图集中处理身份验证,您已经在设置令牌身份验证的位置指定了身份验证类 这意味着,对于您的工作视图集,您指定仅使用令牌身份验证-它在标题中使用令牌前缀,因此您将获得“未提供凭据”
如果您想使用JWT令牌身份验证,您应该在这里显式设置它,或者删除它,并让默认选择的类处理djangorest框架的身份验证,您必须使用这种格式
curl-X GEThttp://localhost:8000/workouts/ -H'授权:令牌XXXXXXXXX'
尝试授权
(即标题:{'Authorization':'Bearer${token}}
)如果你在apache上运行,那么你必须在/etc/apache2/apache2.conf
中添加WSGIPassAuthorization on
,这两种格式都不起作用。我更新了WSGIPassAuthorization on
并使用了大写字母。对于djangorest框架,你必须使用这种格式curl-X GEThttp://localhost:8000/workouts/-H'Authorization:Token xxxxxxxxx'
tryAuthorization
(即标题:{'Authorization':`Bearer${Token}}}
)如果您在apache上运行,那么您必须在/etc/apache2/apache2.conf
中添加WSGIPassAuthorization on
,感谢它,两者都不起作用。我更新了WSGIPassAuthorization on
,并使用了大写字母。这就成功了,并从中删除了rest\u framework.authentication.TokenAuthentication
m默认权限不应该存在。这就成功了,从默认权限中删除了rest\u framework.authentication.TokenAuthentication
。
export const workouts = (token) => {
return axios({
method: 'get',
url: 'http://localhost:8000/workouts',
headers: { 'authorization': `Bearer ${token}`}
})
}