状态保持-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

INSTALLED_APPS = [
    ...
    'rest_framework_simplejwt',  # jwt
]
​
REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # jwt配置
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}
​
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=10),  # JWT有效期这里假定为10min
}

(3)app下的urls.py

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值