flask服务鉴权

news2024/11/24 20:07:20

基本认证(Basic Authentication):

这是一种简单的鉴权方式,需要客户端发送用户名和密码,服务器验证后允许或拒绝访问。可以使用 Flask-BasicAuth 扩展来实现。首先,安装扩展:

pip install Flask-BasicAuth
from flask import Flask
from flask_basicauth import BasicAuth

app = Flask(__name__)
app.config['BASIC_AUTH_USERNAME'] = 'admin'
app.config['BASIC_AUTH_PASSWORD'] = '123456'
app.config['BASIC_AUTH_FORCE'] = False  # 为True 就默认对所有 api 进行认证, 如果设置为 False, 那么可以通过 @basic_auth.required 对指定 api 进行认证。
basic_auth = BasicAuth(app)

@app.route('/')
@basic_auth.required
def hello_world():
    return 'Hello World!'

此时访问鉴权的接口地址会要求输入用户名密码:
在这里插入图片描述
使用代码请求样例:

import requests

url = "http://192.168.3.199:7130"

payload={}
headers = {
   'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
   'Authorization': 'Basic YWRtaW46MTIzNDU2'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

密文处实际为base64加密:

auth = str(base64.b64encode(f'{self.username}:{self.password}'.encode('utf-8')), 'utf-8')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0', "Content-Type": "application/json", 'Authorization': f'Basic {auth}'
}

Token 鉴权(todo)

客户端在请求中携带一个令牌(token),服务器验证该令牌是否有效。这种方式通常用于API鉴权。可以使用 Flask-JWT-Extended 或 Flask-RESTful 等扩展来实现。
通过 Token 鉴权是一种常见的方式,用于保护 Web 应用或 API 的安全性。在 Flask 中,你可以使用第三方扩展如 Flask-JWT-Extended 来实现 Token 鉴权。以下是一个基本的示例:

首先,安装 Flask-JWT-Extended 扩展:

pip install Flask-JWT-Extended
from flask import Flask, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app = Flask(__name__)

# 设置密钥,用于加密 Token
app.config['JWT_SECRET_KEY'] = 'your_secret_key'

# 初始化 JWTManager
jwt = JWTManager(app)

# 路由用于用户登录并生成 Token
@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')
    
    # 这里应该根据用户名和密码验证用户
    # 如果验证成功,创建并返回一个 Token
    if username == 'user' and password == 'password':
        access_token = create_access_token(identity=username)
        return {'access_token': access_token}
    else:
        return {'message': 'Invalid credentials'}, 401

# 受保护的路由,需要 Token 鉴权
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected_route():
    current_user = get_jwt_identity()
    return f'Hello, {current_user}! This route is protected by JWT.'

if __name__ == '__main__':
    app.run()

我们使用 Flask-JWT-Extended 来处理 Token 鉴权。
在 /login 路由中,用户提供用户名和密码进行验证。如果验证成功,将创建并返回一个包含用户身份信息的 Token。
在 /protected 路由中,我们使用了 @jwt_required() 装饰器,它要求请求中必须包含有效的 Token 才能访问。
你需要将上述示例中的用户名和密码验证部分替换为你实际的用户验证逻辑。请确保在生产环境中使用 HTTPS 来保护通信安全,并考虑其他安全性措施,如 Token 过期时间、刷新 Token 等。

自定义装饰器(todo)

你可以编写自己的装饰器函数来实现鉴权逻辑。例如,下面是一个简单的自定义装饰器示例:

from flask import Flask, request, jsonify
from functools import wraps

app = Flask(__name__)

# 用户认证函数,根据用户名和密码验证用户
def authenticate(username, password):
    # 实际应用中,这里应该根据用户名和密码进行验证
    if username == 'user' and password == 'password':
        return True
    return False

# 自定义装饰器函数,用于鉴权
def auth_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        auth = request.authorization
        if not auth or not authenticate(auth.username, auth.password):
            return jsonify({'message': 'Authentication required'}), 401
        return f(*args, **kwargs)
    return decorated_function

@app.route('/')
@auth_required
def protected_route():
    return 'This route is protected by custom authentication.'

if __name__ == '__main__':
    app.run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS 拖拽事件

1.drag等拖拽事件 拖放是由拖动与释放两部分组成,拖放事件也分为被拖动元素的相关事件,和容器的相关事件。 被拖动元素的相关事件如下所示: 被拖动元素相关事件: 事件描述dragstart用户开始拖动元素时触发drag元素正在拖动时触发dragend用户…

高性能系统的性能优化技巧:从专家的经验中学习 | 开源日报 No.40

binhnguyennus/awesome-scalability Stars: 48.3k License: MIT 这个项目是一个阅读列表,用于说明可扩展、可靠和高性能大规模系统的模式。该项目通过知名工程师的文章和可信参考资料来解释概念,并从为数以百万计甚至十亿用户提供服务的经过实战验证的系…

74、SpringBoot 整合 Spring Data JDBC

总结:用起来跟 Spring Data JPA 差不多 什么是 JdbcTemplate?(Template译为模板) Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 ★ Spring Data JDBC 既不需要JPA、Hibernate这种ORM框架&a…

uniapp:tabBar点击后设置动画效果

APP端不支持dom操作,也不支持active伪类,绞尽脑汁也没办法给uniapp原生的tabBar点击加动画效果,所以最终只能舍弃原生tabBar,改用自定义tabBar。 自定义tabBar的原理是,页面的上部分分别是tabBar对应的页面组件&#…

论文速览【序列模型 seq2seq】—— 【Ptr-Net】Pointer Networks

标题:Pointer Networks文章链接:Pointer Networks参考代码(非官方):keon/pointer-networks发表:NIPS 2015领域:序列模型(RNN seq2seq)改进 / 深度学习解决组合优化问题【…

StableAudio-大模型创作音乐的工具

音乐产业即将发生革命。 今天Stability AI,开源人工智能工具和模型之王,例如Stable DIffusion和StableLM,推出Stable Audio,其首款用于音乐和声音生成的人工智能产品。 音乐行业是出了名的难以进入。即使您有才华和动力&#x…

RFID技术在质量控制和生产追溯中的关键应用

在现代制造业中,质量控制和生产追溯是确保产品质量和合规性的关键环节。RFID技术已经成为实现这一目标的强大工具。本文将探讨RFID技术在质量控制和生产追溯中的关键应用,以及如何利用它来提高生产效率、确保产品质量和满足合规性要求。 生产过程追溯 …

Android11 适配

一、修改targetSdkVersion为30 将build.gradle的目标版本targetSdkVersion修改为30(Android 11) targetSdkVersion 30Android11的改变改变主要影响以Adnroid11 为目标版本的应用(targetSdkVersion>30才有影响),和所…

OpenCV实现模板匹配和霍夫线检测,霍夫圆检测

一,模板匹配 1.1代码实现 import cv2 as cv import numpy as np import matplotlib.pyplot as plt from pylab import mplmpl.rcParams[font.sans-serif] [SimHei]#图像和模板的读取 img cv.imread("cat.png") template cv.imread(r"E:\All_in\o…

18672-2014 枸杞 学习记录

声明 本文是学习GB-T 18672-2014 枸杞. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了枸杞的质量要求、试验方法、检验规则、标志、包装、运输和贮存。 本标准适用于经干燥加工制成的各品种的枸杞成熟果实。 2 规范性引用文件…

无代码解决信息孤岛,云表实现软件开发"书同文,车同轨"

什么是信息孤岛?信息孤岛就是一个组织或系统内部的信息资源无法与其他部分或外部系统共享、互操作,从而使得这些信息无法在整个组织或系统中发挥最大作用的现象。这种现象通常发生在不同部门、不同业务领域或不同系统之间,导致信息重复、浪费…

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日,2023世界智能网联汽车大会(以下简称大会)在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办,是我国首个经国务院批准的…

【编码魔法师系列_构建型1.2 】工厂方法模式(Factory Method)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…

基于微信小程序的竞赛管理平台设计与实现(开题报告+任务书+源码+lw+ppt +部署文档+讲解)

文章目录 前言运行环境说明学生微信端的主要功能有:竞赛负责人的主要功能:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前…

33 排序链表

排序链表 题解1 STL - multiset题解2 归并【自顶向下】题解3 归并【自底向上】自底向上:子串长度 l 从1开始,合并后的串长度*2,11 -> 22 -> 44 ->... 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 …

如何选择一款高性价比的便携式明渠流量计

如何选择一款精度高、测量准确、易操作的便携式明渠流量计 如何选择一款精度高、测量准确、易操作的便携式明渠流量计 便携式明渠流量计:是一款对现有在线水监测系统中流量监测的对比装置。该便携式明渠流量计实现了比对在线系统的液位误差及流量误差。引导式的操作…

基于微信小程序的背单词学习激励系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有:管理员的主要功能有:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉…

2023年思维100秋季赛报名中,比赛安排、阶段、形式和5年真题资源

家有小学生的魔都的爸爸妈妈们,上海市含金量比较高的奥数比赛——思维100秋季比赛正在报名中。如果你想让你的孩子多个证书、多个经历、以赛促学,来了解一下吧。 一、思维100比赛是什么? 思维100是原来的“中环杯”,全称"中…

ChatGPT实战-Embeddings打造定制化AI智能客服

本文介绍Embeddings的基本概念,并使用最少但完整的代码讲解Embeddings是如何使用的,帮你打造专属AI聊天机器人(智能客服),你可以拿到该代码进行修改以满足实际需求。 ChatGPT的Embeddings解决了什么问题? …

蓝桥杯 题库 简单 每日十题 day10

01 最少砝码 最少砝码 问题描述 你有一架天平。现在你要设计一套砝码,使得利用这些砝码 可以出任意小于等于N的正整数重量。那么这套砝码最少需要包含多少个砝码? 注意砝码可以放在天平两边。 输入格式 输入包含一个正整数N。 输出格式 输出一个整数代表…