• 16.DRF-JWT


    一、基于JWT的Token登录认证

    1. JWT简介

    json Web Token(缩写JWT)是目前最流行的跨域认证解决方案

    session登录的认证方案是看,用户从客户端传递用户名和密码登录信息,服务端认证后将信息储存在session中,将session_id放入cookie中,以后访问其他页面,服务器都会带着cookie,服务端会自动从cookie中获取session_id,在从session中获取认证信息。

    JWT的解决方案是,将认证信息返回个客户端,储存在客户端,下次访问其他页面,需要从客户端传递认证信息回服务器端。


    2. JWT原理

    JWT原理就是,服务器认证后,生成一个json格式的对象 ,发送个客户端,

    {
    "用户名": "admin",
    "角色": "超级管理员",
    "到期时间": "2019-07-13 00:00:00"
    }
    

    以后,客户端域服务器通信的时候,都要发回这个json对象,服务器完全靠这个对象认定用户身份,(但肯定不会像上面那样,那么简单的发送一个对象)这样的话,session中就没有数据了,后面更容易实现扩展


    3. JWT的数据结构

    JWT分为三个部分,header(头部) payload (负载) signature (签名)

    一个完整的JWT数据是这样的

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjNmMmc1N2E5MmFhIn0.
    eyJpYXQiOjE1NjI4MzM0MDgsImlzcyI6Imh0dHA6XC9cL3d3dy5weWcuY29tIiwiYXVkIjoiaHR0cDpcL1wvd3d3LnB5Zy5jb20iLCJuYmYiOjE1NjI4MzM0MDcsImV4cCI6MTU2MjkxOTgwOCwianRpIjoiM2YyZzU3YTkyYWEiLCJ1c2VyX2lkIjoxfQ.
    NFq1qQ-Z5c4pwit8ZkyWEwX6SBXmnHJcc6ZDgSD5nhU
    

    中间是有三个点的,分别就是 头部 负载 和签名 (点在每一行的最后)

    3.1 头部 是一个json对象 作用是描述JWT元数据,一般是这样的

    {
    "alg": "HS256",      //表示签名的算法默认是 HMAC SHA256(写成 HS256)
    "typ": "JWT"         //表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
    }
    

    最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。

    3.2 负载 也是一个 JSON 对象 ,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用

    除了官方字段,你还可以在这个部分定义私有字段

    这个 JSON 对象也要使用 Base64URL 算法转成字符串(防止除了用户的人看见嘛)。

    注意:JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。(虽然加密了,防止解密的坏人解密后修改在加密)

    3.3 签名 是对前两部分的签名(可以理解成在加密一份),防止数据篡改。

    首先,需要指定一个密钥(自己设置),这个密钥只有服务器才知道,不能泄露给用户。

    使用 Header 里面指定的签名算法(默认是 HMAC SHA256)产生签名

    如:HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)     //使用Header 里面指定的签名算法  将头部和负载部用逗号拼接起来,在加上自己设置的秘钥
    

    那么签名就出来的。

    签名出来后,现在有了 头部的字符串,和负载的字符串 ,还有签名的,在将这三个字符串用 . 拼接出来,就可以将这个拼接好的字符串,返回给客户端的

    JWT数据就返回得了客户端,需要注意的是,头部和负载部,是用base64URL转成字符串的,签名是用头部指定的算法转成字符串的 不用弄混掉

    4. JWT 的使用方式

    客户端,接受到了服务器返回的jwt,可以储存到cookie中,也可以储存在 localStorage。

    此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

    一旦我们使用的JWT,JWT的类别人封装好的,会自动将生成的token放入响应头中去,然后再次去访问页面的时候会带着响应回来token去访问页面

    JWT在请求头中发送,如:会多了个请求头

    Authorization: Bearer <token>  
    

    然后,在服务器中,需要验证这个token,是否有效

    二、Django---使用jwt中的token鉴权机制完成状态保持的步骤

    1. 安装包 djangorestframework-jwt

    pip install djangorestframework-jwt

    2. 配置drf, jwt过期时间

    REST_FRAMEWORK = {
        ''''''
        # 身份认证的方式:JWT session
        'DEFAULT_AUTHENTICATION_CLASSES': (
            # 前后端分离使用jwt验证
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
            # 访问admin后台使用session
            'rest_framework.authentication.SessionAuthentication',
        ),
    }
    # 过期时间为10小时
    JWT_AUTH = {
    	# timedelta 时间差
    	'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=10),
    }
    

    3. 在创建use对象的时候手动生成token

    # 需要生成token
    from rest_framework_jwt.settings import api_settings
    
    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)  # header.payload.signature
    

    4. 在序列化中定义只输出的token属性

    token = serializers.CharField(read_only=True)
    

    5. 为user添加token属性才能输出到客户端

    user.token = token
    
  • 相关阅读:
    Java第一次作业
    第十一次作业
    第十次作业
    第九次作业
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    Java23种设计模式
    第三次作业
  • 原文地址:https://www.cnblogs.com/yanadoude/p/13180858.html
Copyright © 2020-2023  润新知