我在我的 django Rest 框架项目中使用简单的 jwt。我尝试在邮递员中使用屏障令牌进行访问,它显示了此错误
{
"detail": "Authorization header must contain two space-delimited values",
"code": "bad_authorization_header"
}
我的设置文件代码
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(days=15),
"REFRESH_TOKEN_LIFETIME": timedelta(days=1),
"ROTATE_REFRESH_TOKENS": True,
"AUTH_HEADER_TYPES": ('Bearer',),
"AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken", )
}
查看文件代码
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def all_users(request):
users = CustomUser.objects.all().order_by('id')
serializers = UserSerializer(users, many=True)
return Response({
'All users':serializers.data
}, status.HTTP_200_OK)
在邮递员中,我对不记名令牌的输入就像
承载者< access token >
在 simplejwt 库中的 JWTAuthrozation 类的 get_raw_token 过程中出错。
get_raw_token函数验证客户端传递的Authorization Header字段值是否正确,仅返回token值。
class JWTAuthentication(authentication.BaseAuthentication):
...
def get_raw_token(self, header: bytes) -> Optional[bytes]:
"""
Extracts an unvalidated JSON web token from the given "Authorization"
header value.
"""
parts = header.split()
if len(parts) == 0:
# Empty AUTHORIZATION header sent
return None
if parts[0] not in AUTH_HEADER_TYPE_BYTES:
# Assume the header does not contain a JSON web token
return None
if len(parts) != 2:
raise AuthenticationFailed(
_("Authorization header must contain two space-delimited values"),
code="bad_authorization_header",
)
return parts[1]
提问者最后一个条件语句为真,导致错误。
这里的parts变量值为将客户端下发的Authorization Header字段的值以空格分隔后得到的值。
如果你看我的测试,授权的价值就是这样的
“不记名{access_token}”
在上述情况下,get_raw_token方法将这些值分配给parts变量。
[b'承载', b'{access_token}']
我的测试是以正确的形式交付的,所以没有问题。
您遇到的错误是零件数量不是 2 时。
当 Authorization 的值有太多空格时,就会出现这种情况。
确保提问者在传递时以正确的形式传递了 Authorization 的值。