使用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。
-
- 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。