网站首页 > 博客文章 正文
Flask中通常使用Flask-login进行登录验证,而Flask-login使用的是Session实现的登录状态验证,这样就导致每次重新打开网页的时候需要重复登录,或者当出现分布式的时候由于其他服务器可能未与客户端建立连接无法获取登录状态。这时候我们就可以通过Token令牌实现服务端与客户端登录状态验证。
图 1.1 token认证流程
通过上图可以简单整理下token验证的流程:
1、用户登录请求服务器;
2、服务器验证登录信息,根据用户信息生成一个token,并将token和用户信息包装返回给客户端;
3、客户端将返回的token保存在本地,在每次api请求的时候将token写入到请求头部;
4、服务端处理API请求时,获取头部token信息,验证token的合法性,并通过token获取用户信息,处理api,返回api信息给客户端。
flask-httpauth安装
Flask中使用flask-httpauth可以实现token的验证,安装如下:
$ pip install flask-httpauth
使用示例
如下通过一个验证示例来了解如何使用flask-httpauth,flask-httpauth插件支持用户验证方式有:HTTPAuth、HTTPBasicAuth、HTTPDigestAuth、HTTPTokenAuth、MultiAuth几种验证方式。本文主要是介绍HTTPTokenAuth方式实现验证,示例代码如下:
from flask import Flask
from flask_httpauth import HTTPTokenAuth
app = Flask(__name__)
auth = HTTPTokenAuth(scheme='Bearer')
tokens = {
"secret-token-1": "john",
"secret-token-2": "susan"
}
@auth.verify_token
def verify_token(token):
if token in tokens:
return tokens[token]
@app.route('/')
@auth.login_required
def index():
return "Hello, {}!".format(auth.current_user())
if __name__ == '__main__':
app.run()
HTTPTokenAuth 是一个通用的身份验证处理程序,可以与非标准身份验证方案一起使用,方案名称作为构造函数中的参数给出。在上面的示例中,服务器提供的 WWW-Authenticate 标头将使用 Bearer 作为方案:
WWW-Authenticate: Bearer realm="Authentication Required"
verify_token 回调接收客户端在 Authorization 标头上提供的身份验证凭据。这可以是一个简单的标记,也可以包含多个参数,函数必须从字符串中解析和提取这些参数。与 verify_password 一样,如果令牌有效,该函数应返回用户对象。
JWS实现示例
Flask-HTTPAUTH仓库提供了一个JWS实现的完整示例。WS 令牌类似于 JWT 令牌。但是,使用 JWT 令牌需要外部依赖。如下给出认证示例:
from flask import Flask
from flask_httpauth import HTTPTokenAuth
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
app = Flask(__name__)
app.config['SECRET_KEY'] = 'top secret!'
token_serializer = Serializer(app.config['SECRET_KEY'], expires_in=3600)
auth = HTTPTokenAuth('Bearer')
users = ['john', 'susan']
for user in users:
token = token_serializer.dumps({'username': user}).decode('utf-8')
print('*** token for {}: {}\n'.format(user, token))
@auth.verify_token
def verify_token(token):
try:
data = token_serializer.loads(token)
except: # noqa: E722
return False
if 'username' in data:
return data['username']
@app.route('/')
@auth.login_required
def index():
return "Hello, %s!" % auth.current_user()
if __name__ == '__main__':
app.run()
可以通过curl命令验证结果如下:
curl -X GET -H "Authorization: Bearer <jws-token>" http://localhost:5000/
猜你喜欢
- 2024-09-10 BI工具superset管理端的单点登录集成
- 2024-09-10 深圳社会志愿者服务管理平台的设计与实现技术方案
- 2024-09-10 web鉴权access_token、AK/SK、session/cookie
- 2024-09-10 如何用Python和Google“自动化”我的婚礼?
- 2024-09-10 Celery与Django:打造高效DevOps的定时任务与异步处理神器
- 2024-09-10 Python面试者必看!245道经典Python面试题及答案解析,可下载
- 2024-09-10 Python如何实现用户鉴权(python用户认证)
- 2024-09-10 traefik hub配置与使用(traefik 设置客户端ip)
- 2024-09-10 Python 潮流周刊#67:uv 的重磅更新(摘要)
- 2024-09-10 聊一聊我认识的Python安全(python的安全性)
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)