Django REST Framework-基于JSON Web Token的身份验证

2023-04-25 08:55:39 浏览数 (1)

在Django REST Framework中,基于JSON Web Token (JWT) 的身份验证是一种常见的身份验证方法。JWT是一种基于标准JSON格式的开放标准,它可以用于安全地将信息作为JSON对象传输。

安装和配置

首先,您需要安装djangorestframework_simplejwt,这是一个第三方包,可以轻松地实现基于JWT的身份验证。您可以使用以下命令安装它:

代码语言:javascript复制
pip install djangorestframework_simplejwt

安装完成后,您需要将以下内容添加到您的Django设置文件中:

代码语言:javascript复制
# settings.py

INSTALLED_APPS = [
    # ...
    'rest_framework_simplejwt',
    # ...
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

生成和验证Token

在配置完成后,您可以使用djangorestframework_simplejwt中的jwt模块来生成和验证JWT令牌。下面是一个示例:

代码语言:javascript复制
from rest_framework_simplejwt.tokens import RefreshToken

# 生成Token
def generate_token(user):
    refresh = RefreshToken.for_user(user)
    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }

# 验证Token
def validate_token(token):
    try:
        RefreshToken(token).blacklist()
        return True
    except:
        return False

在上面的示例中,我们定义了generate_token()函数,它接受一个用户实例,并使用RefreshToken.for_user()方法生成JWT令牌。返回的字典包含两个令牌:refreshaccessrefresh令牌用于在用户的访问令牌过期时刷新令牌。access令牌用于每个API请求的身份验证。

我们还定义了validate_token()函数,它接受一个JWT令牌,并使用RefreshToken.blacklist()方法来验证和黑名单令牌。如果JWT令牌有效,则返回True。如果JWT令牌无效,则返回False。

基于JWT的身份验证

一旦您已经生成JWT令牌,就可以在Django REST Framework中使用它来进行身份验证了。您可以使用JWTAuthentication类来实现基于JWT的身份验证。下面是一个示例:

代码语言:javascript复制
from rest_framework.authentication import SessionAuthentication
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_simplejwt.authentication import JWTAuthentication

class ExampleView(APIView):
    authentication_classes = [JWTAuthentication, SessionAuthentication]

    def get(self, request, format=None):
        content = {
            'user': str(request.user),  # `django.contrib.auth.User` instance.
            'auth': str(request.auth),  # `rest_framework_simplejwt.authentication.JWTAuthentication` instance.
        }
        return Response(content)

在上面的示例中,我们使用了JWTAuthentication类进行身份验证。在get()方法中,我们使用了request.user属性来获取当前经过身份验证的用户。由于我们还使用了SessionAuthentication类,因此如果用户未经过身份验证,则会回退到会话身份验证。

如果用户未经过身份验证,则会引发HTTP 401未经授权错误。您可以通过为authentication_classes属性设置一个列表来控制哪些身份验证类应用于视图。

JWT的配置选项

在Django REST Framework中,您可以使用SIMPLE_JWT设置来配置JWT选项。以下是一些常见的选项:

代码语言:javascript复制
# settings.py

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,
    'BLACKLIST_AFTER_ROTATION': True,
    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUTH_HEADER_TYPES': ('Bearer',),
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',
}

上述选项中,ACCESS_TOKEN_LIFETIMEREFRESH_TOKEN_LIFETIME用于设置访问令牌和刷新令牌的过期时间。ROTATE_REFRESH_TOKENSBLACKLIST_AFTER_ROTATION用于控制是否在使用新的刷新令牌时将旧的刷新令牌加入黑名单。ALGORITHM用于设置JWT使用的加密算法。SIGNING_KEYVERIFYING_KEY用于签名和验证JWT。AUTH_HEADER_TYPES用于设置使用的身份验证头。USER_ID_FIELDUSER_ID_CLAIM用于设置用户ID。AUTH_TOKEN_CLASSES用于设置JWT的类。TOKEN_TYPE_CLAIM用于设置令牌类型声明。

0 人点赞