Flask_实现token鉴权

这篇具有很好参考价值的文章主要介绍了Flask_实现token鉴权。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、安装依赖

2、实现代码

3、测试

源码等资料获取方法


1、安装依赖

pip install flask
pip install pycryptodome

2、实现代码

import random
import string
import time
import base64

from functools import wraps

from flask import Flask, jsonify, session, request, make_response, g
from cryptography.hazmat.primitives.ciphers.aead import AESGCM


SECRET_KEY = "DnKRYZbvVzdhPlF01rtcxmi5Cj36AbCd"


app = Flask(__name__)
app.config["SECRET_KEY"] = SECRET_KEY


# ========================= 数据加密解密方法 ==============================================
def encrypt_aes_gcm(key, data, nonce_len=32):
    """
    AES-GCM加密
    :param key: 密钥。16, 24 or 32字符长度的字符串
    :param data: 待加密字符串
    :param nonce_len: 随机字符串长度
    """
    key = key.encode('utf-8')
    if not isinstance(data, str):
        data = str(data)
    data = data.encode('utf-8')
    # 生成32位长度的随机值,保证相同数据加密后得到不同的加密数据
    nonce = ''.join(random.sample(string.ascii_letters + string.digits, nonce_len))
    nonce = nonce.encode("utf-8")

    # 生成加密器
    cipher = AESGCM(key)
    # 加密数据
    crypt_bytes = cipher.encrypt(nonce, data, associated_data=None)
    return base64.b64encode(nonce + crypt_bytes).decode()


def decrypt_aes_gcm(key, cipher_data, nonce_len=32):
    """
    AES-GCM解密
    :param key: 密钥
    :param cipher_data: encrypt_aes_gcm 方法返回的数据
    :param nonce_len: 随机字符串长度
    :return:
    """
    key = key.encode('utf-8')

    # 进行base64解码
    debase64_cipher_data = base64.b64decode(cipher_data)

    # 提取密文数据
    nonce = debase64_cipher_data[:nonce_len]
    cipher_data = debase64_cipher_data[nonce_len:]

    # 解密数据
    cipher = AESGCM(key)
    plaintext = cipher.decrypt(nonce, cipher_data, associated_data=None)
    return plaintext.decode()


# ========================= 鉴权部分 ==============================================
def generate_token(username, expiration=3600):
    """ 生成token生成token的密钥
    :param username: 生成token的信息
    :param expiration: token有效时间,单位秒
    """
    expiration = int(time.time() + expiration)
    data = {'username': username, "expiration": expiration}
    return encrypt_aes_gcm(SECRET_KEY, data)


def decrypt_token(token):
    """ 解析token """
    data = decrypt_aes_gcm(SECRET_KEY, token)
    return eval(data)


def login_required(func):
    """ 鉴权装饰器 """

    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取存储的token(如果登录视图使用redis存储的token,这里需要改为从redis获取)
        s_token = session.get("token")

        # 获取请求中带的token
        r_token = request.headers.get("token")

        # 验证请求中是否带有token
        if r_token is None:
            return jsonify(code="4000", msg="鉴权失败")

        # 验证服务器存储的session是否存在
        if s_token is None:
            return jsonify(code="4010", msg="授权失效")

        # 验证token是否匹配
        if s_token != r_token:
            return jsonify(code="4000", msg="鉴权失败")

        # 验证token是否失效
        data = decrypt_token(r_token)
        g.username = data.get("username")     # g变量存储username。(g变量每次请求会重置,可以理解为同一个视图的全局变量)
        expiration = data.get("expiration")
        if expiration < int(time.time()):
            return jsonify(code="4010", msg="授权失效")

        # 还可以继续验证接口签名
        return func(*args, **kwargs)
    return wrapper


# ========================= api接口 ==============================================
@app.post('/login')
def login():
    req = eval(request.data)
    username = req.get('username')
    password = req.get('password')

    # 验证账密
    if username != "admin" and password != "admin":
        return jsonify(code="1000", msg="用户名或密码错误")

    # 账密验证通过,生成token
    token = generate_token(username)

    # 存储token(建议改用redis存储)
    session["token"] = token

    # 定义响应信息
    resp = make_response(jsonify(code="0", data={'token': token}, msg="登录成功"))
    resp.headers["token"] = token
    return resp


@app.post('/index')
@login_required
def index():
    # 视图中使用加密token用到的用户数据
    username = g.username
    return jsonify(code="0", data=f"{username}发起请求", msg="请求成功")


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

流程图

Flask_实现token鉴权,flask,flask,python,后端,程序人生,软件测试,框架,职业发展

3、测试

请求接口不传token

Flask_实现token鉴权,flask,flask,python,后端,程序人生,软件测试,框架,职业发展

请求接口传有效token

Flask_实现token鉴权,flask,flask,python,后端,程序人生,软件测试,框架,职业发展

请求接口传失效token

Flask_实现token鉴权,flask,flask,python,后端,程序人生,软件测试,框架,职业发展

源码等资料获取方法

Flask_实现token鉴权,flask,flask,python,后端,程序人生,软件测试,框架,职业发展

Flask_实现token鉴权,flask,flask,python,后端,程序人生,软件测试,框架,职业发展

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~文章来源地址https://www.toymoban.com/news/detail-584115.html

到了这里,关于Flask_实现token鉴权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】Python Flask token身份认证(附完整代码)

    前言 Python Flask是一个使用Python编写的轻量级Web应用框架,它可以非常方便地搭建Web应用。在Web应用中,经常需要进行身份认证,以确保只有授权用户才能访问某些资源。本文将介绍如何使用token进行身份认证,以及如何在Python Flask中实现token身份认证。 一、什么是token身份认

    2024年02月10日
    浏览(28)
  • Python - flask后端开发笔记

    ​ Flask入门 有一篇很全面的博客可以参考:Python Flask Web 框架入门 跨域问题处理 文件发送 ​

    2024年02月07日
    浏览(53)
  • python3 Flask jwt 简易token认证实例

        chatgpt写的代码

    2024年02月22日
    浏览(38)
  • 搭建flask后端和微信小程序前端

    目录 一、准备工作 (1)我的前端代码 (2)我的后端代码 (3)后端运行成功的截图 (4)前端运行成功的截图  (5)整体运行成功的截图 二、部署后端  (1)在腾讯云的学生入口处购买服务器(建议选择ubuntu系统),设置管理秘钥,方便在本地远程连接。 (2)在本地的

    2024年02月04日
    浏览(41)
  • Flask框架小程序后端分离开发学习笔记《1》网络知识

    Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 协议:http,https (https是加密的http) 主机:g.cn zhihu.com之类的网址 端口:HTTP协议默认是80,因此一般不用填写 路径下面的「/question/31838184」是路径 http://www.zhihu.com/question/31838184 http://www.zhihu.com:80/ 电脑通

    2024年01月17日
    浏览(38)
  • Python Flask 后端向前端推送信息——轮询、SSE、WebSocket

    后端向前端推送信息,通知任务完成 轮询 SSE WebSocket 请求方式 HTTP HTTP TCP长连接 触发方式 轮询 事件 事件 优点 实现简单易兼容 实现简单开发成本低 全双工通信,开销小,安全,可扩展 缺点 消耗较大 不兼容IE 传输数据需二次解析,开发成本大 适用场景 服务端向客户端单向

    2023年04月19日
    浏览(72)
  • 后端flask,前端vue,实现post请求chatgpt流式响应

    vue2写法 vue3 setup写法

    2024年01月21日
    浏览(33)
  • python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序

    现有一个用python写的程序(或者是一个或几个的函数接口),需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便,而且会出现各种麻烦的问题,下面给出如何在web前端调用python的接口。 使用python的RESTful API库将python写的函数封装为Web端可调用的接口,在

    2024年01月20日
    浏览(32)
  • 聊天机器人开发实战--(微信小程序+SpringCloud+Pytorch+Flask)【后端部分】

    趁着五一有时间,先把大三下个学期的期末作业做了,把微信小程序和Java开发的一起做了。顺便把机器学习的也一起做了。所以的话,我们完整项目的技术体系主要有 微信小程序开发,Java Web开发(因为我喜欢把admin后台管理和用户端服务分开,所有我选择SpringCloud做一个切

    2024年02月03日
    浏览(42)
  • 本地部署Python Flask并搭建web问答应用程序框架实现远程访问

    Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程我们使用Python Flask搭建一个web问答应用程序框架,并结合cpolar内网穿透工具将我们的应用程序发布到公共网络上,实现可多人远程进入到该web应用程序访问。 在操作上我们将使用

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包