Django实现jwt方式登录

简介: jwt的概念这边就不再阐述了,就是cookie的替代品view.py

jwt的概念这边就不再阐述了,就是cookie的替代品

view.py

import jwt
import datetime
from rest_framework.decorators import api_view
from rest_framework.response import Response
import learn.utils as tool
# Create your views here.
from fingercode import settings
from learn.models import User
from learn.serializers import UserSerializer
@api_view(('GET', 'POST'))
def login(request):
    if request.method == 'POST':
        username = request.data.get('username')
        password = request.data.get('password')
        if username and password:
            try:
                if not request.META.get('HTTP_AUTHORIZATION', ''):
                    password = tool.md5(password)
                    # user_data = User.objects.get(username=username, password=password)
                    user_dict = UserSerializer(User.objects.filter(username=username, password=password), many=True)
                    payload = {'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1), 'data': user_dict.data}
                    headers = {
                        "type": "jwt",
                        "alg": "HS256"
                    }
                    token = jwt.encode(payload, settings.SECRET_KEY, headers=headers).decode()
                    return Response({'data': token})
                else:
                    authorization = request.META.get('HTTP_AUTHORIZATION', '')
                    auth = authorization.split()
                    # 验证头信息的token信息是否合法
                    if not auth:
                        return Response({'msg': '未获取到Authorization请求头'})
                    if auth[0].lower() != 'jwt':
                        return Response({'msg': 'Authorization请求头中认证方式错误'})
                    if len(auth) == 1:
                        return Response({'msg': "非法Authorization请求头"})
                    elif len(auth) > 2:
                        return Response({'msg': "非法Authorization请求头"})
                    token = auth[1]
                    payload = jwt.decode(token, settings.SECRET_KEY)
                    return Response({'msg': payload})
            except User.DoesNotExist:
                return Response({'msg': '用户名或者密码错误'})
    else:
        return Response(status=404)

models.py

自定义吧,我感觉这个没啥关系,我的就是一个关于user的数据表

serializers.py

from rest_framework import serializers
from learn.models import User
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        exclude = ('password', )

接下来通过包含请求头访问

56909302.png

如果不包含

151304371.png

遇到的bug:

看views.py ,request.POST.get不适用api的post接收,感觉是表单的post提交,而要使用request.data.get才能正确接收到post的值,这里我吃了大亏


目录
相关文章
|
3月前
|
存储 JSON JavaScript
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-1
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
66 0
|
1天前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
10 3
|
1月前
|
JSON 前端开发 Java
|
1月前
|
存储 JSON Java
spring boot3登录开发-1(整合jwt)
spring boot3登录开发-1(整合jwt)
57 1
|
2月前
|
存储 中间件 数据安全/隐私保护
Django教程第3章 | Web开发实战-登录
登录案例、Djiango中间件【2月更文挑战第23天】
53 2
Django教程第3章 | Web开发实战-登录
|
3月前
|
安全 Java 数据库
SpringSecurity+JWT前后端分离架构登录认证
在SpringSecurity实现前后端分离登录token认证详解_springsecurity前后端分离登录认证-CSDN博客基础上进行重构,实现前后端分离架构登录认证,基本思想相同,借鉴开源Gitee代码进行改造,具有更好的代码规范。
175 1
|
3月前
|
JSON 前端开发 安全
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)-2
前后端分离项目知识汇总(微信扫码登录,手机验证码登录,JWT)
58 0
|
3月前
|
Python
百度搜索:蓝易云【Django自带的Admin后台中如何获取当前登录用户】
在上面的代码中,`@staff_member_required`装饰器确保只有管理员可以访问 `my_custom_view`视图,而 `@login_required`装饰器确保只有登录的用户可以访问该视图。然后,可以使用 `request.user.username`获取当前登录用户的用户名,并将其传递到模板中进行显示或其他操作。
33 3
|
3月前
|
存储 JSON 算法
登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)
登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)
|
4月前
|
存储 缓存 NoSQL
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享