• 状态保持-JWT


     Web的状态保持技术 -JWT(Json Web Token)

        在分布式微服务技术流行的今天,大型网站对JWT的使用愈加频繁,相比较于传统的session cookie。

        HTTP 是一个无状态的协议,何为无状态呢?就是说这本次请求和上次请求是没有任何关系的。那么WEB在哪里会频繁应用它?登录某个网站的时候是不是就需要一直保持这一个对应登录用户的状态。显然HTTP不是实现它,传统的解决方法是cookie-Session,而目前流行还有JWT,主要就是一个可靠的认证授权处理。(cookie是session和JWT都需要使用的)

        绝大多数的网站都需要注册登录,常见的登录页面后端使用技术如:

    springsecurity+JWT、Django+JWT等等。

    JWT大致引介

        JWT由三部分构成:header、payload、signature。

        一个JWT的token长什么样子,如下表,根据“.”巧好分别分成三部分,也就是header、payload、signature。

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo4LCJ1c2VybmFtZSI6IjEyMzQ1IiwiZXhwIjoxNjY4ODcyNDAzLCJlbWFpbCI6IiJ9.Jdxf4gaD_dpMpYqnuoNtirLemnBm9f8Wz2hRlNGWaOA

        header:声明类型和加密算法;

        payload:(也称JWT载荷)存放有效信息的位置,包含三部分:标准中注册的声明、公有的声明、私有的声明;

        signature:JWT签证信息(base64加密后的header和payload连接组成的字符串,通过header中的加密方式进行加盐secret组合加密构成)

            一般思路是这样的,当用户登录成功,服务端生成jwt token,然后响应给客户端存起来。下一次发请求必须登录用户才能访问的话,客户端就需要将JWT通过请求头的方式发给后端(jwt凭证是存在客户端),后端拿到JWT token,对前两段利用密钥加密(因此得保护好这个密钥-secret私钥),如果得到的结果与前端传输过来的jwt传输结果相同(服务器就是生成token和校验的),说明没问题,请求将成功打入。

       

    Django JWT

        这里针对是Django较新的版本2.x及之后,因为djangorestframework-jwt已经不支持Django1.x之后的版本(不维持版本更新了)。取而代之的是djangorestframework-simplejwt。

        进入DRF官网(django-rest-framework.org), Search jwt, 点djangorestframework-simplejwt。

        

        点击Simple JWT — Simple JWT 5.2.2.post1+gcc96fd6 documentation,点击django-rest-framework-jwt

       

        这里就可以看到指定版本:

        自行做demo测试:

    (1)安装(pip或编译器)

    pip install djangorestframework-simplejwt

    (2)settings.py或dev.py配置jwt框架与Simple JWT

    1. INSTALLED_APPS = [
    2. ...
    3. 'rest_framework_simplejwt', # jwt
    4. ]
    5. REST_FRAMEWORK = {
    6. ...
    7. 'DEFAULT_AUTHENTICATION_CLASSES': (
    8. # jwt配置
    9. 'rest_framework_simplejwt.authentication.JWTAuthentication',
    10. ),
    11. }
    12. SIMPLE_JWT = {
    13.     'ACCESS_TOKEN_LIFETIME': timedelta(minutes=10),  # JWT有效期这里假定为10min
    14. }

    (3)app下的urls.py

    1. urlpatterns = [
    2. ...
    3. url(r'^api/token/$', TokenObtainPairView.as_view(), name='token_obtain_pair'), # JWT登录(内部认证代码还是Django,登录成功生成JWT)
    4. url(r'^api/token/refresh/$', TokenRefreshView.as_view(), name='token_refresh'),
    5. url(r'^api/token/verify/$', TokenVerifyView.as_view(), name='token_verify'),
    6. ]

    ​【注:只是看到token的话最后两个url可以不写】

    (4)访问localhost:8000/api/token(或者自行配置的域名和端口号)

  • 相关阅读:
    C++笔记之通用多态函数包装器std::function
    UE4 解决C盘缓存问题
    低代码平台AWS PaaS_安装应用商店的标准应用(安装单一应用)
    优化改进YOLOv5算法:加入ODConv+ConvNeXt提升小目标检测能力——(超详细)
    DefaultResourceLoader解读
    小程序的wxss和css区别?
    HBase RowKey 的设计原则?
    DSPE-PEG-DBCO 磷脂-聚乙二醇-二苯并环辛炔 一种线性杂双官能聚乙二醇化试剂
    Java反射用例:
    移动端表格分页uni-app
  • 原文地址:https://blog.csdn.net/lxd_max/article/details/127944300