前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Flask 实现 Session 会话认证和 Token 认证

Flask 实现 Session 会话认证和 Token 认证

原创
作者头像
Lorin 洛林
发布2025-01-18 21:56:59
发布2025-01-18 21:56:59
7800
代码可运行
举报
运行总次数:0
代码可运行

前言

  • 在前后端交互中,用户鉴权可以通过多种方式实现,其中最常见的是基于 Session 的会话认证和基于 Token 的认证(如使用 flask_jwt_extended 实现 JWT)。本文将简要介绍这两种方法的实现方式并提供对应的代码示例。

基于 Session 会话认证

原理

  • Session 是一种基于服务器存储的认证机制。
  • 用户登录成功后,服务器为其生成一个唯一的 session_id,并将其存储在客户端的 Cookie 中。
  • 每次请求,服务器通过验证 session_id 来判断用户的身份。

实现步骤

  1. 用户通过登录接口提交凭据。
  2. 服务器验证凭据后,创建 Session 并将其存储在服务端(如内存或 Redis 中)。
  3. 客户端在请求中携带 Cookie(包含 session_id),服务器验证后允许访问受保护资源。

适用场景

  • 一般用于 Web 应用中。

示例代码

代码语言:python
代码运行次数:0
复制
from flask import Flask, session, redirect, url_for, request, jsonify

app = Flask(__name__)
app.secret_key = 'your_secret_key'

# 模拟用户数据
USER_DATA = {"test_user": "password123"}


# 登录接口
@app.route('/login', methods=['POST'])
def login():
    data = request.json
    username = data.get('username')
    password = data.get('password')

    if username in USER_DATA and USER_DATA[username] == password:
        session['username'] = username  # 创建会话
        return jsonify({"message": "Login successful"}), 200
    return jsonify({"message": "Invalid credentials"}), 401


# 受保护资源
@app.route('/protected', methods=['GET'])
def protected():
    if 'username' in session:
        username = session['username']
        return jsonify({"message": f"Welcome {session['username']}!"}), 200
    return jsonify({"message": "Unauthorized"}), 401


# 登出接口
@app.route('/logout', methods=['POST'])
def logout():
    session.pop('username', None)  # 清除会话
    return jsonify({"message": "Logout successful"}), 200


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

基于 Token 会话认证

原理

  • Token认证 是一种基于客户端的认证机制,通常使用 JSON Web Token (JWT)。
  • 用户登录后,服务器生成一个 Token 返回给客户端。
  • 客户端在后续请求中携带该 Token(如放入请求头),服务器验证后允许访问受保护资源。

实现步骤

  • 用户通过登录接口提交凭据。
  • 服务器验证凭据后,生成 JWT 并返回给客户端。
  • 客户端携带 JWT(通常在 Authorization 头中)访问受保护资源。
  • 服务器通过解析和验证 JWT 确定用户身份。

适用场景

  • 适合跨平台或移动端场景(如前后端分离的应用)。

示例代码

代码语言:python
代码运行次数:0
复制
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'your_jwt_secret_key'

jwt = JWTManager(app)

# 模拟用户数据
USER_DATA = {"test_user": "password123"}


# 登录接口
@app.route('/login', methods=['POST'])
def login():
    data = request.json
    username = data.get('username')
    password = data.get('password')

    if username in USER_DATA and USER_DATA[username] == password:
        access_token = create_access_token(identity=username)  # 创建 JWT
        return jsonify(access_token=access_token), 200
    return jsonify({"message": "Invalid credentials"}), 401


# 受保护资源
@app.route('/protected', methods=['GET'])
@jwt_required()  # 验证 JWT
def protected():
    current_user = get_jwt_identity()
    return jsonify({"message": f"Welcome {current_user}!"}), 200


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

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 基于 Session 会话认证
    • 原理
    • 实现步骤
    • 适用场景
    • 示例代码
  • 基于 Token 会话认证
    • 原理
    • 实现步骤
    • 适用场景
    • 示例代码
  • 个人简介
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档