【软件开发】前后端分离架构下JWT实现用户鉴权

news/2024/11/28 1:43:24/

前后端分离架构下JWT实现用户鉴权

在【计算机网络】JWT(JSON Web Token)初识 中,我们讲解了 JWT 的基础知识。Token 验证的方式一般是用在前后端分离的软件开发项目中,所以本篇文章将会从前端和后端的角度去考虑 JWT 的实现。前端 Vue,后端 Flask。

1.flask-jwt-extended

首先要介绍一个 Python 包,flask-jwt-extended,用于生成 Token 和验证 Token,使用起来非常方便。

pip install flask-jwt-extended
from flask import Flask
from flask import jsonify
from flask import requestfrom flask_jwt_extended import create_access_token
from flask_jwt_extended import get_jwt_identity
from flask_jwt_extended import jwt_required
from flask_jwt_extended import JWTManagerapp = Flask(__name__)# Setup the Flask-JWT-Extended extension
app.config["JWT_SECRET_KEY"] = "super-secret"  # Change this!
jwt = JWTManager(app)# Create a route to authenticate your users and return JWTs. The
# create_access_token() function is used to actually generate the JWT.
@app.route("/login", methods=["POST"])
def login():username = request.json.get("username", None)password = request.json.get("password", None)if username != "test" or password != "test":return jsonify({"msg": "Bad username or password"}), 401access_token = create_access_token(identity=username)return jsonify(access_token=access_token)# Protect a route with jwt_required, which will kick out requests
# without a valid JWT present.
@app.route("/protected", methods=["GET"])
@jwt_required()
def protected():# Access the identity of the current user with get_jwt_identitycurrent_user = get_jwt_identity()return jsonify(logged_in_as=current_user), 200if __name__ == "__main__":app.run()

我们可以利用 Postman 测试一下:

(1)不登录直接请求 protected 接口。

在这里插入图片描述

(2)测试登录接口。

在这里插入图片描述

(3)在 Authorization 中添加相关的 Token 信息,再次请求 protected 接口。

在这里插入图片描述

2.后端实例

我们来看一个实际的项目,后端的登录接口如下。

from flask_jwt_extended import create_access_token@auth_bp.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():username = form.username.datapassword = form.password.dataadmin = Admin.query.filter(Admin.username == username).first()if admin:if username == admin.username and password == admin.password:access_token = create_access_token(identity=username)return jsonify(access_token=access_token)return jsonify({"msg": "用户名或密码错误!"}), 401return jsonify({"msg": "用户名或密码错误!"}), 401return jsonify({"msg": "请重新登录!"}), 401

再来看另外一个接口,是需要登录成功后才能请求到数据。

from flask_jwt_extended import jwt_required@home_bp.route('/search')
@jwt_required()
def search():......return json.dumps(data, ensure_ascii=False)

3.前端实例

用户提交登录表单后,触发登录处理方法,获取 Token,存到 localStorage 中。

handleLogin() {this.$axios({method:"post",url:'auth/login',data:{username: this.loginForm.username, password: this.loginForm.password},headers:{'Content-Type': 'multipart/form-data'},withCredentials: true}).then(res => {localStorage.setItem("token",res.data.access_token);this.$router.push('/xxxxxx');})}

其中的一个请求如下,需要在头部 headers 将 Authorization 设置为 Token 的值,后端 Token 验证通过才能获取到数据。

getInfo() {this.$axios({method:"get",url:'search',headers: {Authorization: "Bearer " + localStorage.getItem('token'),},}).then((res) => {this.tableData = res.data;})}

虽然用户登录是一个很基础的功能,但是要理解透彻这一块的知识点并不容易,我觉得核心在于对网络请求的理解。JWT 只是一种实现方案,实际的项目开发中,会根据具体情况选择合适的鉴权方法。


http://www.ppmy.cn/news/3438.html

相关文章

【算法】实验 1 查找

目录 【实验目的】 【实验预习】 【实验内容】 1. 编写程序,实现顺序查找和折半查找 2. 编写程序,实现哈希表的构造和查找及哈希冲突的检测方法 【实验目的】 1. 掌握查找表、动态查找表、静态查找表和平均查找长度的概念 2. 掌握线性表中顺序表查…

基于opencv传统数字图像处理实现车道线检测详细过程(附源码)

车道线检测 (Lane Detection) 1、实验内容 本实验使用数字图像处理的基本方法,构建了一个车道线检测模型。该模型可以识别图像中所有的车道线,并得到完整的车道线信息。模型在tuSimple Lane Dataset大小为100的数据子集进行了测…

外贸:圣诞新年祝福语语

每到圣诞或者元旦的时候,我都会习惯给过圣诞的客户制作一张卡片,写上祝福的话,然后再在卡片的周围添加上含有我们公司信息和主打产品的图片,这样一来,即祝福了客户,而且还介绍了我们的公司和产品&#xff0…

【lssvm回归预测】基于遗传算法优化最小二乘支持向量机GA-lssvm实现数据回归预测附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

【PAT甲级 - C++题解】1132 Cut Integer

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:PAT题解集合 📝原题地址:题目详情 - 1132 Cut Integer (pintia.cn) 🔑中文翻译:切整数 📣专栏定位…

笔试强训48天——day25

文章目录一. 单选1.一进程刚获得三个主存块的使用权,若该进程访问页面的次序是{1321215123},采用LRU算法时,缺页数2. 以下关于多线程的叙述中错误的是()3. 系统死锁的可能的原因是(&…

【JS020】原生JS实现AJAX

日期:2022年12月14日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#x…

船东提单和货代提单差距这么大?

【船东提单和货代提单差距这么大?】 船东提单即指船公司签发的海运提单(Master B/L,又叫主单,海单,简称M单),可以签发给直接货主(此时货代不出提单),也可签发…