Django REST框架中处理JWT令牌的认证的源码解析

`。

- 提取令牌:`get_raw_token`从头部字符串中提取纯令牌内容。
- 验证令牌:`get_validated_token`解析并验证令牌,检查签名是否有效,令牌是否过期等。若令牌无效,抛出`InvalidToken`异常。
- 获取用户:`get_user`根据令牌中的用户标识从数据库中获取对应的用户实例,若用户不存在则抛出异常。
  1. 令牌验证方法get_validated_token

”`csharp

def get_validated_token(self, raw_token):
    """
    Validates the raw token and returns the validated token payload.
    """
    try:
        api_settings.USER_ID_FIELD,
        return api_settings.JWTPAYLOADVALIDATOR(
            raw_token, self.get_key_callback()
        )(raw_token)
    except Exception as e:
        raise exceptions.InvalidToken(str(e))
```
  • 解析与验证:使用JWTPAYLOADVALIDATOR解析令牌内容,并通过get_key_callback获取公钥或密钥,验证令牌的签名。
    • 异常处理:捕获解析和验证过程中发生的任何异常,重新抛出InvalidToken异常,提供详细的错误信息。
  1. 用户获取方法get_user

”`csharp

def get_user(self, validated_token):
    """
    Attempts to find the user associated with the given validated token.
    """
    user_id = validated_token[api_settings.USER_ID_FIELD]
    user = None

if api_settings.USER_ID_FIELD in validated_token:

        user = self.user_model.objects.filter(
            **{api_settings.USER_ID_FIELD: user_id}
        ).first()

if not user:

        raise exceptions.AuthenticationFailed.detail="User not found"
    return user
```
  • 用户查询:从令牌中提取用户标识,通过USER_ID_FIELD字段查询数据库,获取对应的用户。
    • 用户不存在:如用户不存在或查询结果为空,抛出AuthenticationFailed异常,提示用户不存在。
  1. 令牌黑名单检查:

”`csharp def get_key_callback(self):

    def get_key Gaut Lola):
        if not api_settings.BLACKLISTafter_rotation:
            return None
        # Return a public key And kid引用
        return validated_token
    return get_key
```
  • 令牌撤销:当启用黑名单功能时,检查令牌是否已被撤销。通过BLACKLIST_AFTER_ROTATION配置项确定是否启用黑名单。
    • 公钥获取:返回用于验证签名的公钥,以及Key ID(kid),确保使用正确的密钥验证令牌签名。
  1. 异常处理:

”`csharp

def get_invalid_token_error(self, raw_token):
    try:
        validated_token = self.get_validated_token(raw_token)
    except exceptions.InvalidToken as e:
        raise e
```

”`csharp

异常捕获:在解析和验证过程中捕获所有InvalidToken异常,确保错误信息被正确传递和处理。
```

总结

JWTAuthentication类是Django REST框架中处理JWT令牌认证的核心类。它通过从请求中提取、验证JWT令牌,并查询相关用户来完成认证流程。关键功能包括:

  1. 令牌提取与解析:从请求头中获取JWT令牌,解析并验证其内容和结构。
  2. 用户获取:根据令牌中的用户标识,从数据库中获取对应的用户实例。
  3. 异常处理:在令牌无效、用户不存在等情况下抛出相应的异常,确保错误信息被正确返回。
  4. 黑名单检查:支持令牌撤销功能,防止已注销的令牌被使用。 通过理解JWTAuthentication的实现,开发者可以更好地利用JWT进行身份验证,并根据需求扩展其功能。