使用djangorestframework-jwt可以简单地实现用户认证和令牌认证

我是中国的开发者。我曾在东京浜松町工作了大约一年。请多多关照。

对djangorestframework-jwt进行介绍

使用djangorestframework-jwt包作为Django的包,可以轻松实现用户认证和令牌认证。

本篇文章介绍了如何使用djangorestframework-jwt创建API的方法。

操作系统:可以选择Win10或CentOS
Python版本:3.7
Django版本:3.1.2
所需环境:

安装

需要这两个库。

$ pip install djangorestframework

$ pip install djangorestframework-jwt

涂层

将这些代码进行修改或添加到settings.py文件中。

import datetime

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # <-- 追加する
    'my_app'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',  <-- コメントする
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

# 認証用のフレームワーク
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated'
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication'
    )
}

JWT_AUTH = {
    # トークンの有効時間を設定する
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=60 * 60 * 2)
}

将代码插入到urls.py中。

这里有两个API。

    1. userLogin是一个用于用户注册认证的API。前端通过POST将用户名和密码发送到后端进行注册,然后获取令牌的API。(可以使用Django管理员的超级用户来作为用户名和密码。)

 

    getInfo是一个使用令牌来获取信息的API,该信息是在用户注册后获取的。
from django.urls import path
from my_app import views

urlpatterns = [
    path('userLogin/', views.user_login),
    path('getInfo/', views.get_info)
]

将代码插入到views.py中。

import json
from django.http import JsonResponse
from django.contrib.auth import authenticate, login
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework_jwt.settings import api_settings


def user_login(request):
    obj = json.loads(request.body)
    username = obj.get('username', None)
    password = obj.get('password', None)

    if username is None or password is None:
        return JsonResponse({'code': 500, 'message': '请求参数错误'})

    is_login = authenticate(request, username=username, password=password)
    if is_login is None:
        return JsonResponse({'code': 500, 'message': '账号或密码错误'})

    login(request, is_login)

    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    payload = jwt_payload_handler(is_login)
    token = jwt_encode_handler(payload)

    return JsonResponse(
        {
            'code': 200,
            'message': '登録成功',
            'data': {'token': token}
        }
    )


# APIにトークン認証を付与する
@api_view(['GET'])
@permission_classes((IsAuthenticated,))
@authentication_classes((JSONWebTokenAuthentication,))
def get_info(request):
    data = 'some info'

    return JsonResponse(
        {
            'code': 200,
            'message': 'success',
            'data': data
        }
    )

前端如何使用API

首先,通过使用userLogin进行POST请求,获取令牌。

使用Get函数,并使用getInfo函数,在Headers的Authorization参数中指定JWT和先前获取的令牌来发起请求。

token = 'abcdefg123456789'

authorization = 'JWT' + token

如果这样做,就可以请求getInfo。

广告
将在 10 秒后关闭
bannerAds