flask+vue使用jwt验证

为什么要使用jwt验证?

jwt(json web token)主要用来解决单点登录(SSO)问题。设想一个场景,你在淘宝登录了你的账号,然后打开天猫(天猫属于淘宝的子网站),那么你需不需要重新登录呢?答案是不用,你会发现天猫。在一个站点登录后,在其它子站点就不需要重复登录,这就是单点登录。

传统的方法用session解决,session保存在服务端,记录用户的登录信息。然而像淘宝这种大型网站往往有多个服务器,服务器之间需要session共享才能实现上述功能。

jwt能较好解决这个问题。用户登录完成后,由服务端签发一个token,包含了用户登录信息,过期时间等等。然后把它加密发给用户,用户下次请求的时候把它放在请求头传给服务端,服务端经过愉快的解密就可以知道用户已经登录啦!

在我的小项目当中,用户登录只需要密码,用session不好处理,所以也采用了jwt验证方法。

Flask后端代码

shell 复制代码
pip install pyjwt
python 复制代码
import jwt
app.secret_key = b'secret_key'

@app.route("/login", methods=["POST"])
def login():
    if request.method == 'POST':
        print("password",request.json['password'])
        token = jwt.encode({'exp': datetime.now(tz=timezone.utc) + timedelta(seconds=3600), 'password':request.json['password']}, current_app.config['SECRET_KEY'], algorithm="HS256") # 生成token
        print(token)
        return jsonify(err="已生成token", token=token)

# 装饰器函数
def login_required(func):
    @functools.wraps(func) # 修饰内层函数,防止当前装饰器去修改被装饰函数的属性
    def inner(*args, **kwargs):
        print("token",request.headers.get('token'),type(request.headers.get('token')))
        if request.headers.get('token')!='null':
            password = jwt.decode(request.headers.get('token'), current_app.config['SECRET_KEY'], algorithms="HS256")['password']
            # print(password)
            if password == '123':
                return func(*args, **kwargs)
            else:
                return jsonify(err="无效token")
        else:
            return jsonify(err="请输入密码")
    return inner

Vue前端代码

前端需要用到cookies,把token保存在浏览器里

shell 复制代码
npm install vue-cookies --save

main.js

js 复制代码
import VueCookies from 'vue-cookies'
Vue.use(VueCookies)

app.js

js 复制代码
created(){
      // 设置cookies 30天后过期
      this.$cookies.config('30d')

      // window object
      window.$cookies.config('30d')
      
    }

保存token到cookies里

js 复制代码
request.post('/login',{"password":value}).then(res=>{
            that.$cookies.set("token",res['token'])}

在请求头里携带token发送请求

js 复制代码
request.post("/submit_edit",  this.form, {headers:{token: this.$cookies.get('token')}})
相关推荐
橘子海全栈攻城狮5 分钟前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
AC赳赳老秦13 分钟前
OpenClaw 采集任务日志审计:全程记录采集行为,满足合规溯源与企业审计要求
java·大数据·python·数据挖掘·数据分析·php·openclaw
huangdong_33 分钟前
电商图片下载工具横向对比深度评测:固乔、FATKUN、图快、当图、淘蛙、存图宝七款工具全面解析
python
满怀冰雪1 小时前
04-Paddle Tensor 基础:形状、数据类型、广播与索引
python·深度学习·神经网络·paddle
cui_ruicheng1 小时前
Python从入门到实战(十五):文件操作与目录管理
开发语言·python
xcLeigh1 小时前
Doubao-Seed-Evolving大模型接入教程|搭建全品类提示词+AI工具导航网页
前端·人工智能·python·ai·html·ai开发·豆包
不如语冰1 小时前
AI大模型入门-模块导入import
数据结构·人工智能·pytorch·python
投票竞赛1 小时前
书法、绘画作品投票评选,图片投票小程序作品集排版
python·小程序
梦远青城1 小时前
Docker 部署python的paddle进行OCR文字识别身份证
python·docker·ocr·paddle·身份证识别
编码者卢布2 小时前
【Azure APIM】APIM的诊断日志与Application Insights的日志是否可以串联为一个端到端的日志链路呢?
python·flask·azure