Flask中基于Token的身份认证的实现
作者:陌北v1 发布时间:2022-11-20 06:45:53
Flask提供了多种身份认证方式,其中基于Token的身份认证是其中一种常用方式。基于Token的身份认证通常是在用户登录之后,为用户生成一个Token,然后在每次请求时用户将该Token作为请求头部中的一个参数进行传递,服务器端在接收到请求后验证该Token是否有效。
下面是基于Token的身份认证的具体实现步骤:
在用户登录成功之后,为该用户生成一个Token,通常使用jwt库进行生成。
将该Token返回给客户端,客户端需要将该Token存储起来,例如可以将该Token保存在浏览器的Cookie中,或者使用本地存储。
当客户端发送请求时,需要将该Token作为请求头部中的一个参数进行传递,例如可以将该Token放在Authorization字段中,例如Authorization: Bearer <Token>。
服务器端在接收到请求时,从请求头部中获取该Token,并验证该Token是否有效。验证方法通常是使用jwt库进行验证,例如验证Token的有效期、签名等等。
如果Token验证成功,则认为该请求是合法的,可以继续处理;如果Token验证失败,则返回401 Unauthorized状态码。
下面是一个基于Token的身份认证的示例代码:
from flask import Flask, request, jsonify
from flask_jwt_extended import create_access_token, jwt_required, JWTManager, get_jwt_identity
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret'
jwt = JWTManager(app)
users = {
'john': 'password',
'susan': 'strongpassword'
}
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if not username or not password:
return jsonify({"msg": "缺少用户名或密码"}), 400
if username not in users:
return jsonify({"msg": "未找到用户"}), 404
if users[username] != password:
return jsonify({"msg": "用户名或密码错误"}), 401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token), 200
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user), 200
这个例子中,/login 接口用来验证用户的用户名和密码,并生成一个 Token,/protected接口用了 @jwt_required()装饰器,表示只有在请求头中包含 Token 的请求才会通过身份验证。create_access_token 用来生成 Token,get_jwt_identity 用来获取当前用户的用户名。
客户端请求示例:
1.登录,获取 Token:
curl -X POST \
http://localhost:5000/login \
-H 'Content-Type: application/json' \
-d '{
"username": "john",
"password": "password"
}'
发送包含 Token 的请求:
curl -X GET http://localhost:5000/protected -H 'Authorization: Bearer <token>'
其中<token>是登录时获取到的Token。
来源:https://blog.csdn.net/qq233325332/article/details/129097024


猜你喜欢
- 一、Oracle 11g安装安装之前要先确定自己的电脑配置,以windows为例,如果是win7以下系统如xp等,可以选择Oracle 10
- 在开发中有需求在详情显示里外键字段内容,并且添加按钮弹窗内容,以及按钮跳转内容。以前并没有做过相似的开发,我们的后台是xadmin,当时正在
- 程序出错的时候,我们往往需要根据异常信息来找到具体出错的代码。简单地用print打印异常信息并不能很好地追溯出错的代码:# -*- codi
- 这篇文章记录一个采样器都随机地从原始的数据集中抽样数据。抽样数据采用permutation。 生成任意一个下标重排,从而利用下标来提取dat
- 正则表达式简介正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码
- 目前两个客户端扩展库连接超时可以设置选项来操作,比如mysqli: <?php //创建对象 $mysqli = mysqli_ini
- 本文实例讲述了Python实现PS滤镜特效之扇形变换效果。分享给大家供大家参考,具体如下:这里用 Python 实现 PS 滤镜中的一种几何
- 【基本介绍】【格式】:pivot(聚合函数 for 需要转为列的字段名 in(需要转为列的字段值))【说明】:实现将指定字段的字段值转换为列
- 在 EeePC 上装了个 Mac OS X,相应的开发工具也选择了 Coda。在
- mysql是一个优秀的开源数据库,它现在的应用非常的广泛,因此很有必要简单的介绍一下用python操作mysql数据库的方法。python操
- 本文实例讲述了python使用opencv实现马赛克效果。分享给大家供大家参考,具体如下:最近要实现opencv视频打马赛克,在网上找了一下
- 本文实例讲述了python实现支持目录FTP上传下载文件的方法。分享给大家供大家参考。具体如下:该程序支持ftp上传下载文件和目录、适用于w
- 1.字符串处理将字符串中的数字替换成其两倍的值,例如:修改前:"AS7G123m (d)F77k"修改后:"A
- 一、Go的内建类型errorerror类型其实是一个接口类型,也是GO语言的内建类型;在这个接口类型的声明中只包含了一个方法Error;Er
- 本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件进行批量掩膜与批量重采样的操作。首先,我们来明确一下本文的具体需求。现有一个
- 新闻、文章系统中经常会用到的一个功能,添加上一篇,下一篇或相关文章的功能可以增加访客停留的时间。也许新人在做这上一篇、下一篇功能时使用的是I
- 查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率。最近在对项目中的一些s
- '把pattern 又修改了下'code
- 代码如下:<% '隐藏并修改文件的最后修改时间的aspshell '原理:通过FSO可以修改文件的
- 前几天看到某论坛有人提了这么个问题,Python这么火,为啥找工作这么难呢? 这两年因为第三波人工智能热潮让 Python火了一把