当前位置: 代码网 > it编程>编程语言>Asp.net > Django REST Framework (DRF) 项目中实现JWT的示例代码

Django REST Framework (DRF) 项目中实现JWT的示例代码

2025年02月08日 Asp.net 我要评论
前言:json web tokens (jwt) 是一种开放标准 (rfc 7519),用于在各方之间安全地传输信息。在现代 web 应用中,jwt 认证是一种常见的身份验证机制,它提供了无状态、轻量

前言:json web tokens (jwt) 是一种开放标准 (rfc 7519),用于在各方之间安全地传输信息。在现代 web 应用中,jwt 认证是一种常见的身份验证机制,它提供了无状态、轻量级的身份验证方式。本文将详细介绍如何在 django rest framework (drf) 项目中实现 jwt 认证,并配置 token 黑名单以增强安全性。

1、安装依赖

需要安装 djangorestframework 和 djangorestframework-simplejwt 包。你可以使用 pip 来安装它们

pip install djangorestframework
pip install djangorestframework-simplejwt

2、配置项目

编辑 settings.py 文件,添加 rest_framework 和 rest_framework_simplejwt 到 installed_apps: 

installed_apps = [
    ...
    'rest_framework',
    'rest_framework_simplejwt',
    'rest_framework_simplejwt.token_blacklist',
    ...
]

3、配置jwt

3.1 配置默认认证类和权限类

在 settings.py 中配置默认的认证类和权限类: 

rest_framework = {
    'default_authentication_classes': (
        'rest_framework_simplejwt.authentication.jwtauthentication',
    ),
    'default_permission_classes': (
        'rest_framework.permissions.isauthenticated',
    ),
}

3.2 配置jwt设置

在 settings.py 中配置 jwt 的一些选项,例如 token 的过期时间、签名算法等:

from datetime import timedelta

simple_jwt = {
    'access_token_lifetime': timedelta(minutes=5),
    'refresh_token_lifetime': timedelta(days=1),
    'rotate_refresh_tokens': true,
    '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',
}

4、创建视图和序列化器

4.1 创建自定义 token 视图

创建一个视图来处理登录请求,返回 jwt token。

# views.py
from rest_framework_simplejwt.views import tokenobtainpairview, tokenrefreshview, tokenblacklistview
from rest_framework_simplejwt.serializers import tokenobtainpairserializer
from rest_framework import status
from rest_framework.response import response
from rest_framework.views import apiview
from django.contrib.auth.models import user
from .serializers import registerserializer

class mytokenobtainpairserializer(tokenobtainpairserializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)
        # add custom claims
        token['username'] = user.username
        return token

class mytokenobtainpairview(tokenobtainpairview):
    serializer_class = mytokenobtainpairserializer

class registerview(apiview):
    def post(self, request, *args, **kwargs):
        serializer = registerserializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            return response({
                "user": userserializer(user, context=self.get_serializer_context()).data,
                "message": "user created successfully.  now perform login to get your token",
            })
        return response(serializer.errors, status=status.http_400_bad_request)

# serializers.py
from rest_framework import serializers
from django.contrib.auth.models import user

class registerserializer(serializers.modelserializer):
    class meta:
        model = user
        fields = ('username', 'password', 'email')
        extra_kwargs = {'password': {'write_only': true}}

    def create(self, validated_data):
        user = user.objects.create_user(
            username=validated_data['username'],
            email=validated_data['email'],
            password=validated_data['password']
        )
        return user

class userserializer(serializers.modelserializer):
    class meta:
        model = user
        fields = ('id', 'username', 'email')

4.2 配置url

在 urls.py 中配置 url 路由,以便访问登录、注册、刷新和注销视图:

# urls.py
from django.urls import path
from .views import mytokenobtainpairview, registerview

urlpatterns = [
    path('login/', mytokenobtainpairview.as_view(), name='token_obtain_pair'),
    path('login/refresh/', tokenrefreshview.as_view(), name='token_refresh'),
    path('logout/', tokenblacklistview.as_view(), name='token_blacklist'),
    path('register/', registerview.as_view(), name='auth_register'),
]

5、测试api

使用 postman 或其他 http 客户端来测试你的 api。以下是一些示例请求:

5.1 注册新用户

url: /register/
method: post
body:

{
  "username": "testuser",
  "email": "testuser@example.com",
  "password": "testpassword"
}

5.2 登录并获取jwt token

url: /login/
method: post
body:

{
  "username": "testuser",
  "password": "testpassword"
}

5.3 刷新jwt token

url: /login/refresh/
method: post
body:

{
  "refresh": "your_refresh_token"
}

5.4 注销(将token加入黑名单)

url: /logout/
method: post
body:

{
  "refresh": "your_refresh_token"
}

6、总结

通过以上步骤,我们成功地在 django rest framework 项目中实现了 jwt 认证,并配置了 token 黑名单以增强安全性。jwt 认证提供了一种无状态、轻量级的身份验证方式,而 token 黑名单则确保了已注销的 token 不会被再次使用,从而提高了应用的安全性。

到此这篇关于django rest framework (drf) 项目中实现jwt的示例代码的文章就介绍到这了,更多相关django rest framework jwt内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com