django使用rest_framework_simplejwt认证

580 阅读2分钟
  • 安装coreAPI

    pip install coreapi 
    
  • 安装djangorestframework:

    pip install djangorestframework
    
  • 安装djangorestframework-simplejwt

    pip install djangorestframework-simplejwt
    

    现在前后端分离基本都是采用了Token/JWT的认证默认,由于djangorestframework-jwt的作者已经不更新了,所以最新版本的python、Django都不能使用了,万幸的是还有djangorestframework-simplejwt,并且支持最新版本。 我的安装环境:python(3.10) django(4.0.3)

  • 项目setting.py配置

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'rest_framework',  # 很重要
        'rest_framework_simplejwt',# 很重要
        'system',  # 这只是我自己的一个APP而已。
    ]
    
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework_simplejwt.authentication.JWTAuthentication', # 这个是全局采用的认证方式
        ],
        'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',  # 这个是coreAPI使用的
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',  # DRF的分页
        'PAGE_SIZE': 10 # 每页的数据条数
    }
    
    SIMPLE_JWT = {
        'ACCESS_TOKEN_LIFETIME': timedelta(days=5), # token的过期时间,我这里设置的是五天。timedelta是从datetimen导入的,from datetimen import timedelta
        'REFRESH_TOKEN_LIFETIME': timedelta(days=7), # 刷新认证的时间,七天。
        'USER_ID_FIELD': 'id',
        'USER_ID_CLAIM': 'user_code',
        'ALGORITHM': 'HS256',
        'SIGNING_KEY': SECRET_KEY,
        'AUTH_HEADER_TYPES': ('Token',),
    }
    
  • app里面的views.py

    from django.contrib.auth.models import User, Group
    from rest_framework import viewsets
    from rest_framework.permissions import IsAuthenticated
    from system.serializer import UserSerializer, GroupSerializer
    
    
    class UserViewSet(viewsets.ModelViewSet):
        """
        允许用户查看或编辑的API路径。
        """
        permission_classes = (IsAuthenticated, ) # 这个就是告诉REF该视图必须认证才能被访问
        queryset = User.objects.all().order_by('-date_joined')
        serializer_class = UserSerializer
    
    
    class GroupViewSet(viewsets.ModelViewSet):
        """
        允许组查看或编辑的API路径。
        """
        queryset = Group.objects.all()
        serializer_class = GroupSerializer
    
  • app里面serializer.py

    from django.contrib.auth.models import User, Group
    from rest_framework import serializers
    
    
    class UserSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = User
            fields = ('url', 'username', 'email', 'groups')
    
    
    class GroupSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Group
            fields = ('url', 'name')
    
  • 项目的urls.py

    from django.contrib import admin
    from django.urls import path, include
    from rest_framework.routers import DefaultRouter
    from rest_framework_simplejwt.views import TokenRefreshView, TokenVerifyView, TokenObtainPairView
    from system.views import UserViewSet, GroupViewSet
    from rest_framework.documentation import include_docs_urls
    
    
    router = DefaultRouter()
    router.register(r'users', UserViewSet) #记住这里不能写namebase,否则会报错,具体啥原因我也不知道。
    router.register(r'groups', GroupViewSet)
    
    urlpatterns = [
        path('', include(router.urls)),
        path('admin/', admin.site.urls),
        path('login/', TokenObtainPairView.as_view(), name='login'), # 这个就是获取token的
        path('token/Refresh', TokenRefreshView.as_view(), name='token_refresh'),
        path('token/Verify', TokenVerifyView.as_view(), name='token_verify'),
        path('docs/', include_docs_urls(title="My API title")) # 是coreAPI的API文档路径,很酷的界面。
    ]
    
    urlpatterns += router.urls
    

    在这里需要注意一点就是,Django 4已经没有url的方法了,所以一定要注意哟。

  • 请求得到Token演示

微信图片_20220410184223.png 得到两个返回结果refresh与accress,refresh是用于token过期后刷新accress用的,accress就是我们请求时候携带的token值,那么为啥accress过期了要刷新呢,不直接重新请求accress呢?希望哪个大神可以解答一些,谢谢。

  • Token验证请求示例

1.png 这里一定要注意请求头为Authorization 携带的为Token+空格+access的值。

  • coreAPI界面

微信图片_20220410185557.png 努力学习到老,可以预防老年痴呆。