前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django REST Framework-基于JSON Web Token的身份验证

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

原创
作者头像
玖叁叁
发布2023-04-25 08:55:39
2K0
发布2023-04-25 08:55:39
举报
文章被收录于专栏:玖叁叁

在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用于设置令牌类型声明。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装和配置
  • 生成和验证Token
  • 基于JWT的身份验证
  • JWT的配置选项
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档