7.JWT认证

1.jwt的定义和作用

JSON Web Token (JWT) 是一个非常轻巧的规范,常见的两种jwt

  • jws (JSON Web Signature) 轻量级,适合token认证
  • jwe (SON Web Encryption) 相对繁琐,适合数据传输

作用:

  • 解决跨域认证
  • 解决csrf跨域问题

2.jwt工作原理

  • 用户以 Web表单 的形式,将自己的用户名和密码 POST 到后端的接口。
  • 后端核对用户名和密码成功后,会计算生成JWT Payload 字符串,然后返回 response 给浏览器。
  • 浏览器收到 JWT 后,将其保存在 cookie里
  • 后续在该域上发出的请求,都会将 JWT放入HTTP Header 中的 Authorization 字段。
  • 后端收到新请求后,会使用密钥验证 JWT 签名。
  • 验证通过后后端使用 JWT 中包含的用户信息进行其他相关操作,返回相应结果。

在这里插入图片描述

3. jwt的组成

  • 头部(Header)

  • 载荷(Payload)

  • 签名(Signature)

头部(Header)

  • typ:声明类型这里是 JWT
  • alg:声明加密的算法通常直接使用 HMAC SHA256

载荷(Payload)

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

签名(Signature)

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

4.如何生成jwt

import jwt
import datetime
import uuid

salt = 'minggezuishuai'

# 构造header , 这里不写默认的也是
headers = {
    'typ': 'JWT',
    'alg': 'HS256'
}

# 构造payload
payload = {
    'user_id': str(uuid.uuid4()),  # 自定义用户ID
    'username': "wangbm",  # 自定义用户名
    'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=5)  # 超时时间,取现在时间,五分钟后token失效
}

5.jwt如何存储

将jwt存储在cookie中不开启HttpOnly,通过请求的Header进行传输,任然存在xss攻击,通过校验参数避免xss攻击

6.jwt如何发送

将JWT放在Header里的Authorization 字段,并使用 Bearer标注

'Authorization': 'Bearer ' + ${token}
from flask import request, g
from .jwt_util import verify_jwt

def jwt_authentication():
    """
    根据jwt验证用户身份
    """
    g.user_id = None
    g.is_refresh_token = False
    authorization = request.headers.get('Authorization')
    if authorization and authorization.startswith('Bearer '):
        token = authorization.strip()[7:]
        payload = verify_jwt(token)
        if payload:
            g.user_id = payload.get('user_id')
            g.is_refresh_token = payload.get('refresh')

7.jwt如何校验

def verify_jwt(token, secret=None):
    """
    检验jwt
    :param token: jwt
    :param secret: 密钥
    :return: dict: payload
    """
  
    try:
        payload = jwt.decode(token, secret, algorithm=['HS256'])
    except jwt.PyJWTError:
        payload = None

    return payload

8.jwt最佳搭档

JWT最好与HTTPS 配合使用,利用 HTTPS 的非对称加密来保证 JWT 的安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值