drf框架之用户登录状态保持(代码片段)

littlefivebolg littlefivebolg     2023-01-11     337

关键词:

 

  本篇主要介绍 用户状态保持的两种的方案 -- session 和 jwt_token,以及这两种方案的实现方式,及优缺点对比。

  引入:HTTP协议是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码进行用户认证,那么下一次请求时,用户还是要再一次进行用户认证才行。

  因为根据HTTP协议的无状态性,在下一次请求时我们并不知道是哪个用户发出的请求,所以为了让我们能识别是哪个用户发送的请求,则必须采取一些特殊的方式,比如 session、jwt_token等。

 

一、session

  根据上面的应用,我可以通过session来保存用户的登录状态,而Django默认提供了session存储机制,且默认启动了session。

技术分享图片

  session存储方式:数据库、本地缓存、混合存储三种。通常采用本地缓存:

SESSION_ENGINE=django.contrib.sessions.backends.cache

  那么我们怎么使用用户登录状态保持呢?

  在用户登录或者注册成功后,设置session。

class UserView(APIView):
    ......
    # 实现用户登录或者注册的业务逻辑
    request.session[user_id] = user.id
    request.session[is_login] = True
    
    .....
    # 返回响应

  由于session是保存在服务器中,在设置session时会将 生成随机字符串(sessionID),通过cookie发送给客户端,而服务器端会同sessionID作为键并且将我们设置的进行加密计算形参长字符串作为值存储在服务器端。

  关于session存储机制可参考:https://www.cnblogs.com/lenther2002/p/4822302.html

 缺点:

  1. Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。
  2. 扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。
  3. CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击

 

二、jwt_token

  基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

  其实现的基本流程如下:

  1. 用户进行登录或者注册成功,服务器返回一个token
  2. 客户端存储token(可以存储在cookie中,也可以存储在本地硬盘)
  3. 每次请求均携带上这个token值
  4. 服务器校验token值(Django扩展提供了jwt_token认证机制),返回数据

 

 1、jwt是什么?

  JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

 

 2、其构成如下:

  1、header -- 头部,主要用来声明类型,这是jwt。并且声明加密算法,通常为HMAC SHA256。

  2、payload -- 载荷,存放标准中注册的声明(签发方,接收方等)、添加用户的相关信息等

  3、signature --  签证,需要base64转换后的header和base64装换后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行利用secret_key进行组合加密,而得到signature。

 注:

  1. 在payload中不要存放敏感信息,因为这部分信息只是使用了base64进行了装换,而不是加密。
  2. secret_key不要暴露,若暴露用户可以根据该header和payload自行生产jwt。

 

 3、它的实现机制如下:

  即 用户每次请求携带该token,Django进行认证时,会取出header 和payloads部分,并结合Django的秘钥secret_key使用header中声明的加密方式进行加密生成一个新的 signature2,对用户携带的token中的第三部分 signature1进行对比,若用户修改了token则生成的signature2与用户携带的signature1不一致,则无法通过验证。

  1、是否有token 决定是否进行jwt认证。

  2、token的正确性决定是否能够通过jwt认证 。

 优点:

  • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
  • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
  • 它不需要在服务端保存会话信息, 所以它易于应用的扩展

 实现:

  1、安装:

pip install djangorestframework-jwt

  2、配置

REST_FRAMEWORK = 
    DEFAULT_AUTHENTICATION_CLASSES: (
        rest_framework_jwt.authentication.JSONWebTokenAuthentication,
        rest_framework.authentication.SessionAuthentication,
        rest_framework.authentication.BasicAuthentication,
    ),


#  JWT_EXPIRATION_DELTA 指明token的有效期
JWT_AUTH = 
    JWT_EXPIRATION_DELTA: datetime.timedelta(days=1),

  3、实现

class UserView(APIView):
    .......
    # 实现注册或者登陆的业务逻辑
    
    # 生成记录登录状态的token
        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)

        user.token = token
    
        .......
        # 返回响应

  注:前提:

  这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *

  

  由于我们之前在上面 配置了默认的认证类包含了:

DEFAULT_AUTHENTICATION_CLASSES: (
        rest_framework_jwt.authentication.JSONWebTokenAuthentication,
    )

  故用户在每次请求时携带 token,Django的认证系统会自动对该token进行认证。若认证通过,则会用户认证完成。

 

   over~~~,简单的介绍了两次常用的用户登录状态保持的方案~~~,关于session介绍的并不全,有机会再补充~~~

 

drf框架qq登录功能(代码片段)

用户模块---QQ登录流程图QQ登录文档:http://wiki.connect.qq.com/%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C_oauth2-0流程简述:1.当点击qq登录图标时,进入生成登录url的接口2.在前端的回调函数中跳转到qq登录的扫码页面3.扫码登陆后,qq会携带code访问申请时... 查看详情

drf之文档生成和jwt(代码片段)

...定制频率2自动生成接口文档3JWT3.1自定制auth认证类3.2控制用户登录后才能访问,和不登录就能访问3.3控制登录接口返回的数据格式3.4自定义基于jwt的权限类3.5手动签发token(多方式登录)3.6jwt的配置参数1自定制频率#自定制频率... 查看详情

drf之三大认证(代码片段)

...s(request)self.check_throttles(request)这就是drf的三大认证。二、用户认证1.drf的用户认证?我们的某些接口需要对用户进行辨别,那么我们该如何区分A用户和B用户呢?如果A用户想访问B用户的余额,这种操作是不被允许的。在django中,... 查看详情

drf框架之serializers序列化组件(代码片段)

...学了序列化工具json工具,就是吧信息存为类字典形式2.DRF框架自带序列化的工具:serializers 3.DRF框架serializers分为:第一种Serializer 第二种ModelSerializer 第一种用法之Serializerfromdjango.dbimportmodels#Createyourmod 查看详情

drf框架serializer之视图优化(代码片段)

一、create优化在serializer序列化中,我们通过创建序列化器对象的方式大大地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下:fromdjango.httpimportJsonResponsefromdjango.viewsimportViewfromdjango.dbimpor... 查看详情

drf框架之mixins(代码片段)

一、ListModelMixin提供list(request,*args,**kwargs)方法获取已存在的列表数据(获取多条记录)获取成功,则返回200OK1.引入方式fromrest_framework.mixinsimportListModelMixin2.源码对比我们可以发现,两处的代码基本一致,因此我们直接拿到使用来... 查看详情

抽屉之tornado实战--装饰器实现用户登录状态验证(代码片段)

当然今天讲的验证,不只Tornado会用,以后用到web框架都会用到,最常见的场景就是只有用户登陆了才能执行某些操作,所以在执行这些操作前要先做登陆状态的验证。  比如:点赞,发布,评论等需要验证,都需要用到ifself.s... 查看详情

drf-jwt认证(代码片段)

1JWT认证在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用JsonWebToken(本质就是token)认证机制。#Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的... 查看详情

drf框架serializer之modelserializer(代码片段)

...性,因此会选择一种更为简洁的序列化器类来帮我们优化框架代码,简化序列化器类中字段的创建常规序列化器类示例:fromrest_frameworkimportserializersfromrest_frameworkimpo 查看详情

drf之jwt傻瓜式启动说明书(代码片段)

...F之jwt使用说明书jwt介绍JsonWebToken如何获取token先创建一张用户表,要想使用jwt,必须使用django自带的用户表在models.py中写一个用户类,导入、继承AbstractUser在Terminal中做数据库迁移,createsuperuser创建超级用户在路由中导入jwt的模... 查看详情

drf框架之自定义action(代码片段)

一、自定义action使用action装饰器methods支持的请求方式,为一个列表,默认为[‘get‘]detail必传参数,要处理的是否是详情资源对象(即是否通过url路径获取主键)True表示需要传递主键id,使用通过URL获取的主键对应的数据对象Fal... 查看详情

django视图之状态保持cookiesession(代码片段)

...xff0c;有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie最早是网景公司的前雇员LouMontulli在1993年3月的发明。Cookie是由服务器端生成࿰... 查看详情

微信小程序本地缓存保持登录状态之wx.setstoragesync()使用技巧(代码片段)

简介微信小程序提供了一个如同浏览器cookie本地缓存方法,就是wx.setStorageSync()。注意,该方法是同步请求,还有个异步请求的方法是wx.setStorage(),参考官方文档。取出本地缓存方法wx.getStorageSync,同样的,... 查看详情

37.状态保持之session详解(代码片段)

...浏览器上,很不安全!那有没有更好些的来存储登录状态的方式呢???这就需要讲讲session了!1.状态保持——cookie和session:http协议是无状态的:每次请求都是一次新的的请求, 查看详情

38.状态保持之session详解(代码片段)

...浏览器上,很不安全!那有没有更好些的来存储登录状态的方式呢???这就需要讲讲session了!1.状态保持——cookie和session:http协议是无状态的:每次请求都是一次新的的请求, 查看详情

通过vuex存储token,通过前置路由守卫完成对登录操作之后的token值验证,完成登录状态的保持(代码片段)

账号和密码正确,则需要来保持用户的登录状态而前后端分离如何保存登录状态保持用户的登录状态cookie/session[考虑到跨域问题]前后端分离保持用户登录状态的方案tokentoken是后端返回给前端一个加密后的字符串,需要在本地进行... 查看详情

drf教程7-认证(代码片段)

...略就能使用这些凭据来决定是否允许这个请求。  REST框架提供了多种开箱即用的方案,也允许你实施自定义的方案。  认证总是在view的最开始运行,在权限检查之前,在其他任何代码被允许执行之前。  request.user属性通... 查看详情

drf认证组件权限组件jwt认证签发jwt框架使用(代码片段)

...user对象九、drf项目的jwt认证开发流程(重点)十、drf-jwt框架基本使用安装(终端)签发token校验token(认证组件)设置需要登录才能访问的接口进行测试(views.py)测试访问登录认证接口(Postman)一、注册接口urls.pyrouter.register('... 查看详情