DRFの組立JWT認証モジュール
まず、認証ルール
フルネーム:JSONウェブトークンは
説明:元のデータは列JSON、背景生成、ウェブフロントストレージを介して送信された暗号化された
フォーマットthree--ペイロード署名ヘッド-ヘッド及び負荷がBASE64のみMD5署名、可逆暗号化を有しています不可逆的な暗号化
コンテンツ:
ヘッド(基本情報、また空にすることができます):暗号化、企業情報、チーム情報、...
ペイロード(コア情報):ユーザー情報、有効期限、...
署名(セキュリティ):ヘッド結果結果の暗号化+ペイロード+ MD5は、秘密鍵暗号化サーバの結果を暗号化
認定ルール:
背景には、サーバの秘密鍵のセキュリティを保護する必要があります(それが唯一のセキュリティJWTのある)
トークンの背景の発行- >トークンによる認証を必要とする要求を送信します- - >フロントストレージ>正当なユーザーを取得するには、バックグラウンドチェック
なぜ認定をJWT必要があります:
1)背景・ニーズのみ検証トークンアルゴリズムに関連して、ストアの証明書に必要な、トークン記憶されない、効率はバックグラウンドチェックよりもはるかに大きい店を完了し、トークン取得された
2)JWT認証アルゴリズムは、サーバークラスタの展開に適しています
第二に、認証モジュール
インストール:PIPインストールdjangorestframework-JWT
モジュールパッケージ:rest_framework_jwt
DRF-JWTのフレームワークを使用して、後者のタスクはログのみに書き込むために必要な
ログインを書き換える理由:DRF-JWTが唯一のログインアカウントのパスワードを完了し、我々はまた、携帯電話のログを必要とし、上のメールログ
なぜが認定クラスを書き換える必要はありません:認証ルールが完了しているのでと唯一のプレフィックス認証文字列になって、固定、接頭辞は、設定ファイルで設定することができます
三、JWT使用
JWTの構成;
settings.py設定ファイルでは、デフォルトで設定されていない場合、デフォルトJWTを行きます
設定urls.pyで
トークンを発行したテスト・郵便配達の表情で
注:上記の3つのインターフェイスは、POSTリクエストを送信します
第四に、マルチログの使用JWT
注:APIResponseカスタムResponseオブジェクト
# views.py
from rest_framework.views import APIView
from . import models,serializers
from utils.response import APIResponse
class LoginAPIView(APIView):
# 登录接口应该禁用所有的认证和、权限,因为不管是谁都应该能进来
authentication_classes = []
permission_classes = []
def post(self, request, *args, **kwargs):
# 将数据传到序列化组件进行校验
user_ser = serializers.LoginSerializer(data=request.data)
user_ser.is_valid(raise_exception=True)
return APIResponse(msg='login success', data={
'username': user_ser.user.username,
'token': user_ser.token
})
# serializer.py
from rest_framework.serializers import ModelSerializer, CharField, ValidationError, SerializerMethodField
from . import models
from django.contrib.auth import authenticate
import re
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
class LoginSerializer(ModelSerializer):
username = CharField(write_only=True)
password = CharField(write_only=True)
class Meta:
model = models.User
fields = ('username', 'password')
def validate(self, attrs):
# user_obj = authenticate(**attrs)
# if not user_obj:
# raise ValidationError('用户名或密码错误')
# 账号密码登录 ==》 多方式登录
user = self._many_method_login(**attrs)
# 通过user对象生成payload载荷
payload = jwt_payload_handler(user)
# 通过payload签发token
token = jwt_encode_handler(payload)
# 将user和token存放在序列化对象中,方便返回到前端去
self.user = user
self.token = token
return attrs
# 多方式登录 (用户名、邮箱、手机号三种方式登录)
def _many_method_login(self, **attrs):
username = attrs.get('username')
password = attrs.get('password')
# 利用正则匹配判断用户输入的信息
# 1.判断邮箱登录
if re.match(r'.*@.*', username):
user = models.User.objects.filter(email=username).first() # type: models.User
# 2.判断手机号登录
elif re.match(r'^1[3-9][0-9]{9}$',username):
user = models.User.objects.filter(mobile=username).first()
# 3.用户名登录
else:
user = models.User.objects.filter(username=username).first()
if not user:
raise ValidationError({'username': '账号有误'})
if not user.check_password(password):
raise ValidationError({'password': '密码错误'})
return user
郵便配達テストコードを使用します。