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> /// 认证用户信息 ...
随机推荐
- int ,long , long long , __int64类型的范围
首先见测试代码(在g++/gcc下运行): #include<iostream> using namespace std; int main() { cout<<sizeof( ...
- C#/VB.NET 比较两个Word文档差异
本文以C#和VB.NET代码为例,来介绍如何对比两个Word文档差异.程序中使用最新版的Spire.Doc for .NET 版本8.8.2.编辑代码前,先在VS程序中添加引用Spire.Doc.dl ...
- 微服务技术栈:API网关中心,落地实现方案
本文源码:GitHub·点这里 || GitEE·点这里 一.服务网关简介 1.外观模式 客户端与各个业务子系统的通信必须通过一个统一的外观对象进行,外观模式提供一个高层次的接口,使得子系统更易于使用 ...
- CentOS ISO 下载地址
x86_64:https://wiki.centos.org/Download ARM:http://mirror.nsc.liu.se/centos-store/altarch/ http://dl ...
- 谱聚类的python实现
什么是谱聚类? 就是找到一个合适的切割点将图进行切割,核心思想就是: 使得切割的边的权重和最小,对于无向图而言就是切割的边数最少,如上所示.但是,切割的时候可能会存在局部最优,有以下两种方法: (1) ...
- C++ 7种排序方法代码合集
class Solution { public: /******************************************************************** 直接插入排 ...
- “DNAT+云链接+CDN”加速方案,助力出海企业落地生长
摘要:“DNAT+云链接+CDN”加速方案,真正释放技术红利,真诚助力企业出海. 随着国内互联网行业的人口红利逐渐消失,本土互联网市场竞争不断加剧,加之国家多项“走出去”政策的推动,越来越多的中国互联 ...
- 给Django的Admin添加自定义Action 并移除需要选择对象的限制
不得不说,Django的Admin真的给开发带来很多便利,这不,我又来折腾了,这次是添加自定义的action 这个自定义的Action可以看看官方文档的介绍,很详细,不再赘述. https://doc ...
- 字段在class文件中的存在形式——FieldInfo
每个字段(Field)都有field_info结构所定义,一个class文件中,不会有两个字段同时具有相同的名字和描述符 name_index:值为一个整数(常量池表中的有效索引),例如name_in ...
- 建设开发者生态:6项华为API管理原则落地
摘要: 为了向开发者提供良好.一致.稳定的华为API的体验,华为通过明确“API管理六项原则”,来支持开发者生态建设. 一个不开放的组织,会慢慢成为一潭僵水,一个封闭的系统,能量最终会耗尽,在产品开发 ...