我在 DRF 项目中使用简单的 JWT 进行身份验证。当我尝试访问该 api 时,它显示 bad_authorization_header

问题描述 投票:0回答:1

我在我的 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 >

django django-rest-framework postman bearer-token django-rest-framework-simplejwt
1个回答
0
投票

在 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字段的值以空格分隔后得到的值。

enter image description here

如果你看我的测试,授权的价值就是这样的

“不记名{access_token}”

在上述情况下,get_raw_token方法将这些值分配给parts变量。

[b'承载', b'{access_token}']

我的测试是以正确的形式交付的,所以没有问题。

您遇到的错误是零件数量不是 2 时。

当 Authorization 的值有太多空格时,就会出现这种情况。

像这样 enter image description here 与以前不同,我给了 .ey 一个空格。

确保提问者在传递时以正确的形式传递了 Authorization 的值。

“授权”:“承载{access_token}”

© www.soinside.com 2019 - 2024. All rights reserved.