您的当前位置:首页正文

状态保持-JWT

2024-11-30 来源:个人技术集锦

 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。

    

    点击,点击

   

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

    自行做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(或者自行配置的域名和端口号)

显示全文