token认证、JWT
登录的token操作
#app.models.py :表结构
from django.db import models
class User(models.Model):
user = models.CharField(max_length=32)
password = models.CharField(max_length=32)
def __str__(self):
return self.user
class UserToken(models.Model):
token = models.CharField(max_length=64)
user = models.OneToOneField(to='User') #app.objectjson.py :序列化模块
from rest_framework import serializers
from app import models
class UserJson(serializers.ModelSerializer):
class Meta:
model = models.User
fields = '__all__' #app.views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from app import models, common, objectjson class Login(APIView):
def post(self, request):
data_dic = request.data
user = models.User.objects.filter(**data_dic).first()
if user:
# 登录成功操作token
token = common.get_token()
# token的数据库操作,第一次产生token是新建,再次就是更新
models.UserToken.objects.update_or_create(user=user, defaults={'token': token})
user_data = objectjson.UserJson(user).data
return Response({
'status': 0,
'message': 'login success',
'token': token, # 将token返回给前台
'results': user_data
})
return Response({
'status': 1,
'message': 'login failedr'
})
认证方法的实现
#源码分析
# as_view()=> APIView.dispatch => self.initial(request,*args,**kwargs) => 封装后的drf的request => request.user => self._authenticate() => authenticate(self,reuquest)的源码根据地 #app.views.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed class LoginAuthenticate(BaseAuthentication):
def authenticate(self, request):
# 登录逻辑:如果用户登录了,登录操作产生了token,且前后台同步了
# 登录判断:再次发生请求,没有token代表没登录,错误token,代表无效的登录,token正确才是正常的登录用户
# 如何将token取出,规定token用请求头传递
token = request.META.get('HTTP_TOKEN')
result = models.UserToken.objects.filter(token=token).first()
print(result)
if result:
# 认证通过,可以返回None(有多个认证时),可以返回两个值:user,auth
return result.user, token
else:
# 认证失败,抛出APIException或其子类对象
raise AuthenticationFailed('认证失败') class Books(APIView):
authentication_classes = [LoginAuthenticate] # 视图函数处理的逻辑
def get(self, request):
# 通过认证后,用request.user拿到当前登录的用户,用request.auth拿到认证值(该值通常自定义)
print(request.user)
return Response({
'status': 0,
'message': 'ok',
'results': []
})
局部认证
#app.auth.py 完成校验的所有逻辑
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app import models
class LoginAuthenticate(BaseAuthentication):
def authenticate(self, request):
token = request.META.get('HTTP_TOKEN')
result = models.UserToken.objects.filter(token=token).first()
print(result)
if result:
return result.user, token
else:
raise AuthenticationFailed('认证失败') class Books(APIView):
#添加登录认证即可
authentication_classes = [auth.LoginAuthenticate]
def get(self, request):
print(request.user)
return Response({
'status': 0,
'message': 'ok',
'results': []
})
全局认证
# 1.在settings.py中配置
# 全局认证
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'app.auth.LoginAuthenticate'
),
}
#2.所有的CBV类都不需要添加类属性:authentication_classes
# 局部禁用
# 3.在不需要认证的CBV类中添加类属性:authentication_classes =[]
注销:在全局认证情况下
class Logout(APIView):
# 在全局认证情况下,如果能走get方法,代表已经通过登录认证(登录状态),就可以注销
def get(self, request):
models.UserToken.objects.update_or_create(user=request.user, defaults={'token': common.get_token()})
return Response({
"status": 0,
"msg": 'logout success',
})
JWT
# jwt: json web tokens
# jwt规范:就是对token的规范,头.体.签名
'''
1.token一定是后台产生,拥有请求认证,所以要前后台统一
2.token的组成部分通常有三分部组成:header.payload.signature
3.header:{"token的加密方式": "base64", "是否有签名": True} 加密处理后的结果
4.payload:{"账号": *, "密码": *, "发行者": *, "过期时间": *, "浏览器信息": *} 加密处理后的结果
5.signature:{"header": *, "payload": *, "salt": *} 加密处理后的结果 eg: eyJ0eXAiOiJK.eyJ1c2VyX2lkIjoxLCJ1cNTgzMDM1NDR9.4j5QypLwuf
'''
JWT-token操作
# 安装 djangorestframework-jwt
# -- pip3 install djangorestframework-jwt # 采用 djangorestframework-jwt框架 产生 jwt规范的 token
from rest_framework_jwt.settings import api_settings
def get_jwt_token(user):
# 自定义生成token,基于某user对象,且该user对象必须有username、password两个字段
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return token
token认证、JWT的更多相关文章
- 二.3.token认证,jwt认证,前端框架
一.token: 铺垫: 之前用的是通过最基本的用户名密码登录我的运维平台http://127.0.0.1:8000/---这种用的是form表单,但是这种对于前后端分离的不适合.前后端分离,应该通过 ...
- Django+JWT实现Token认证
对外提供API不用django rest framework(DRF)就是旁门左道吗? 基于Token的鉴权机制越来越多的用在了项目中,尤其是对于纯后端只对外提供API没有web页面的项目,例如我们通 ...
- JWT—JSON Web Token - 理解JWT网络间应用用户安全认证交互设计
原文地址:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ 官网地址:https://jwt.io/ JSON Web Token(JW ...
- 程序员过关斩将--更加优雅的Token认证方式JWT
菜菜,上次你讲的cookie和session认证方式,我这次面试果然遇到了 结果怎么样? 结果面试官问我还有没有更好的方式? 看来你又挂了 别说了,伤心呀.到底还有没有更好的方式呢? 你猜? 基于To ...
- JWT的优点和实现Token认证的安全问题
JWT的优点和实现Token认证的安全问题 一.什么是JWT JWT——Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准,可实现无状态.分布式的Web应 ...
- token 与 基于JWT的Token认证
支持跨域访问,无状态认证 token特点 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输 无状态(也称:服务端可扩展行): ...
- iOS 开发之基于JWT的Token认证机制及解析
在移动端和服务端通信中,一般有两种认证方式:token 和 session. 1.session/cookie 认证机制: 在服务端创建一个Session对象,同时在客户端的浏览器端创建一个Cooki ...
- 基于JWT的Token认证机制及安全问题
[干货分享]基于JWT的Token认证机制及安全问题 https://bbs.huaweicloud.com/blogs/06607ea7b53211e7b8317ca23e93a891
- 使用jwt进行token认证
简单说明:最近在搞权限这一块的东西,需要用到jwt进行token认证,才有了如下的demo演示 具体细节可以看gitbug,噗,不是bug是hub github地址:https://github ...
- asp.net core 3.1 自定义中间件实现jwt token认证
asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...
随机推荐
- RFC2474 - Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers的双语版
RFC2474 - Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers英文版 ...
- 结对项目:四则运算(C语言)
github地址:https://github.com/nilonger/arithmetic 结对伙伴:杨锐龙+黄海钊 一.项目要求 1.1 题目:实现一个自动生成小学四则运算题目的命令行程序(也可 ...
- python数据处理工具 -- pandas(序列与数据框的构造)
Pandas模块的核心操作对象就是对序列(Series)和数据框(Dataframe).序列可以理解为数据集中的一个字段,数据框是值包含至少两个字段(或序列) 的数据集. 构造序列 1.通过同质的列表 ...
- php使用curl来获取远程图片
本文章来介绍php使用curl来获取远程图片实现方法,有需要了解采集远程图片的朋友不防进入参考. curl要求php环境支持才行. 可以运行phpinfo()函数是否支持,一般要将php.ini中;e ...
- asyncio系列之Lock实现
import types import select import time import socket import functools import collections class Futur ...
- Java 接口 抽象类 抽象方法
abstract class elehousekeeping { //抽象家用电器类 abstract void opermode(); //抽象方法} class TV extends elehou ...
- xmind8 破解激活教程
这里以windows为例来演示,其它操作系统需根据情况修改相应步骤. 一.下载安装包 首先去xmind国外官网下载对应操作系统的安装包,国内官网的那个是有残缺的,不支持破解. 官网下载链接 二.下载破 ...
- React技术实践(1)
随着系统越来越庞大,前端也变得越来越复杂,因此,构建一套组件化的前端变得很重要了. 之前一直在使用Asp.net来进行前端的组件化,Asp.net组件化有个很大的缺陷,就是和后台代码绑定太紧密了,不符 ...
- 深入Spring Security-获取认证机制核心原理讲解
文/朱季谦 本文基于Springboot+Vue+Spring Security框架而写的原创笔记,demo代码参考<Spring Boot+Spring Cloud+Vue+Element项目 ...
- linux安装dubbo与zookeeper(一)
所需工具: jdk1_7.tar.gz dubbo-admin-2.5.4.war(此文件不需解压) zookeeper.tar.gz tomcat7.0.tar.gz 以上文件下载需根据自己的电脑系 ...