高级 Python Web 应用中的身份验证与授权机制解析

news/2025/1/2 17:40:58/

高级 Python Web 应用中的身份验证与授权机制解析


目录

  1. 🍪 Cookie 和 Session 机制
  2. 🔑 JWT(JSON Web Token)及其在 FastAPI 和 Django 中的应用
  3. 🔐 OAuth2 和 OpenID Connect 的实现
  4. 🛡️ Django 中的用户认证与权限系统
  5. 🚫 CSRF/XSS 防护

🍪 1. Cookie 和 Session 机制

在 Web 应用中,身份验证和用户状态管理是至关重要的功能。Cookie 和 Session 是最常用的两种状态管理机制,它们各自有不同的特性和应用场景。

📌 Cookie 和 Session 的工作原理

Cookie服务器发送到客户端的一小段数据,客户端会在每次请求时将其带回。Cookie 通常用于保存用户的登录状态、偏好设置等。

Session服务器端存储的用户数据,客户端通过一个唯一的 Session ID 来访问这些数据。Session ID 通常以 Cookie 的形式存储在客户端。

Cookie 的生命周期由其设置的过期时间决定,浏览器会在过期后自动删除 Cookie。而 Session 的生命周期则依赖于服务器配置,通常会在用户关闭浏览器时失效或在一段时间后过期。

📌 在 Flask 中实现 Cookie 和 Session

Flask 是一个轻量级的 Python Web 框架,它对 Cookie 和 Session 的支持非常直观。以下是如何在 Flask 中实现 Cookie 和 Session 的代码示例:

python">from flask import Flask, session, request, redirect, url_forapp = Flask(__name__)
app.secret_key = 'supersecretkey'  # 用于加密 Session 数据@app.route('/set_cookie')
def set_cookie():response = redirect(url_for('get_cookie'))response.set_cookie('my_cookie', 'cookie_value')return response@app.route('/get_cookie')
def get_cookie():cookie_value = request.cookies.get('my_cookie')return f'Cookie Value: {cookie_value}'@app.route('/set_session')
def set_session():session['user'] = 'John Doe'return redirect(url_for('get_session'))@app.route('/get_session')
def get_session():user = session.get('user', 'Not logged in')return f'Session User: {user}'if __name__ == '__main__':app.run(debug=True)
🧩 代码解析
  1. 设置 Cookieresponse.set_cookie('my_cookie', 'cookie_value') 用于在响应中设置一个名为 my_cookie 的 Cookie。
  2. 读取 Cookierequest.cookies.get('my_cookie') 从请求中读取名为 my_cookie 的 Cookie 值。
  3. 设置 Sessionsession['user'] = 'John Doe' 将用户信息存储在服务器端的 Session 中。
  4. 读取 Sessionsession.get('user', 'Not logged in') 从 Session 中获取用户信息,若不存在则返回默认值 'Not logged in'
🚀 运行示例

启动 Flask 应用并访问 /set_cookie/set_session 路由,可以设置和查看 Cookie 和 Session 的值。这展示了如何使用 Flask 管理用户的会话数据以及客户端的 Cookie。


🔑 2. JWT(JSON Web Token)及其在 FastAPI 和 Django 中的应用

JWT(JSON Web Token)是一种用于安全传输信息的标准格式。它在身份验证和信息交换中扮演着重要角色,尤其是在分布式系统和微服务架构中。JWT 是一种自包含的令牌,它可以在网络中安全地传输信息。

📌 JWT 的结构和工作原理

JWT 由三部分组成:

  1. Header(头部):包含令牌的类型(JWT)和所使用的加密算法。
  2. Payload(负载):包含声明(claims),这些声明可以是关于实体的信息以及元数据。负载部分是可以被解码的,但未加密。
  3. Signature(签名):用于验证消息的完整性和来源。签名部分是使用 Header 中指定的算法对 Header 和 Payload 进行签名生成的。

JWT 的传输过程通常包括以下步骤:

  1. 客户端登录后,服务器生成一个 JWT,并将其返回给客户端。
  2. 客户端将 JWT 存储在本地(通常是 Cookie 或 Local Storage 中)。
  3. 在后续的请求中,客户端将 JWT 附加到请求头中,服务器通过验证 JWT 来确认用户的身份。
📌 在 FastAPI 中实现 JWT

FastAPI 提供了对 JWT 的良好支持,以下是如何在 FastAPI 中实现 JWT 认证的示例:

python">from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
from jose import JWTError, jwt
from typing import Optionalapp = FastAPI()SECRET_KEY = "mysecretkey"
ALGORITHM = "HS256"class User(BaseModel):username: strdef create_jwt_token(data: dict):return jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)def decode_jwt_token(token: str):try:return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])except JWTError:raise HTTPException(status_code=401, detail="Invalid token")@app.post("/token")
def generate_token(user: User):token = create_jwt_token({"sub": user.username})return {"access_token": token}@app.get("/protected")
def protected_route(token: str = Depends(decode_jwt_token)):return {"message": "Protected route accessed", "user": token['sub']}
🧩 代码解析
  1. 生成 JWTcreate_jwt_token(data) 函数创建一个 JWT 令牌,其中 data 包含用户信息。
  2. 解码 JWTdecode_jwt_token(token) 函数解码 JWT 并验证其有效性。
  3. 生成令牌接口/token 路由接受用户信息并返回 JWT 令牌。
  4. 受保护路由/protected 路由要求提供有效的 JWT 令牌进行访问。
🚀 运行示例

运行 FastAPI 应用,访问 /token 路由以获取 JWT,然后使用返回的令牌访问 /protected 路由。此示例展示了如何在 FastAPI 中集成 JWT 认证。

📌 在 Django 中实现 JWT

Django 通过第三方库 djangorestframework-simplejwt 提供了对 JWT 的支持。以下是如何在 Django 中实现 JWT 的示例:

  1. 安装 djangorestframework-simplejwt

    pip install djangorestframework-simplejwt
    
  2. 更新 settings.py 以包含 JWT 配置:

    python">REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication',),
    }
    
  3. urls.py 中添加 JWT 认证路由:

    python">from django.urls import path
    from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshViewurlpatterns = [path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ]
    
  4. 保护视图使用 JWT 认证:

    python">from rest_framework.permissions import IsAuthenticated
    from rest_framework.views import APIView
    from rest_framework.response import Responseclass ProtectedView(APIView):permission_classes = [IsAuthenticated]def get(self, request):return Response({"message": "Protected view accessed"})
    
🧩 代码解析
  1. JWT 配置:通过 REST_FRAMEWORK 设置 JWT 认证类。
  2. JWT 路由:使用 TokenObtainPairViewTokenRefreshView 提供 JWT 生成和刷新功能。
  3. 受保护视图:使用 IsAuthenticated 权限类保护视图,确保只有通过 JWT 认证的用户可以访问。
🚀 运行示例

启动 Django 开发服务器,并访问 /api/token/ 路由以获取 JWT,然后访问受保护的 API 路由以验证 JWT 功能。此示例展示了如何在 Django 中使用 JWT 进行身份验证。


🔐 3. OAuth2 和 OpenID Connect 的实现

OAuth2 和 OpenID Connect 是现代应用程序中常用的授权和认证协议。OAuth2 专注于授权,而 OpenID Connect 在 OAuth2 的基础上提供了身份认证功能。

📌 OAuth2 协议概述

OAuth2 是一种授权框架,允许第三方应用程序代表用户访问资源。OAuth2 定义了四种授权流程:

  1. 授权码流程:适用于 Web 应用,用户通过授权服务器获取授权码,然后通过授权码获取访问令牌。
  2. 隐式流程:适用于单页应用,用户直接获得访问令牌。
  3. 密码凭证流程:适用于受

信任的应用,用户提供用户名和密码以获取访问令牌。
4. 客户端凭证流程:适用于服务对服务的访问,客户端使用其凭证获取访问令牌。

📌 OpenID Connect 协议概述

OpenID Connect 是在 OAuth2 的基础上增加了身份验证的协议。它引入了 ID Token,用于携带用户的身份信息。OpenID Connect 使用 OAuth2 的授权码流程来获取 ID Token 和访问令牌。

📌 在 FastAPI 中实现 OAuth2 和 OpenID Connect

以下是 FastAPI 中集成 OAuth2 和 OpenID Connect 的示例:

python">from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2AuthorizationCodeBearer
from pydantic import BaseModel
from typing import Optionalapp = FastAPI()oauth2_scheme = OAuth2AuthorizationCodeBearer(authorizationUrl="https://example.com/auth",tokenUrl="https://example.com/token"
)class User(BaseModel):username: strasync def get_current_user(token: str = Depends(oauth2_scheme)):# 模拟用户获取if token == "valid_token":return User(username="John Doe")else:raise HTTPException(status_code=401, detail="Invalid token")@app.get("/user")
async def get_user(current_user: User = Depends(get_current_user)):return {"user": current_user.username}
🧩 代码解析
  1. OAuth2AuthorizationCodeBearer:使用 OAuth2 授权码流程。
  2. get_current_user:验证传入的令牌,模拟用户信息获取。
  3. 受保护路由/user 路由使用 Depends(get_current_user) 保护,确保只有合法用户可以访问。
🚀 运行示例

运行 FastAPI 应用,并通过 OAuth2 授权流程获取访问令牌,然后访问 /user 路由验证用户信息。此示例展示了如何在 FastAPI 中实现 OAuth2 和 OpenID Connect。

📌 在 Django 中实现 OAuth2 和 OpenID Connect

Django 可以通过第三方库 django-oauth-toolkit 实现 OAuth2 支持。以下是配置 OAuth2 的步骤:

  1. 安装 django-oauth-toolkit

    pip install django-oauth-toolkit
    
  2. 更新 settings.py

    python">INSTALLED_APPS = [# 其他应用'oauth2_provider',
    ]
    
  3. urls.py 中添加 OAuth2 路由:

    python">from django.urls import path, include
    from oauth2_provider.views import TokenView, RevokeTokenViewurlpatterns = [path('o/token/', TokenView.as_view(), name='token'),path('o/revoke_token/', RevokeTokenView.as_view(), name='revoke_token'),
    ]
    
  4. 配置 OAuth2 认证类:

    python">from rest_framework.permissions import IsAuthenticated
    from rest_framework.authentication import OAuth2Authentication
    from rest_framework.views import APIView
    from rest_framework.response import Responseclass ProtectedView(APIView):authentication_classes = [OAuth2Authentication]permission_classes = [IsAuthenticated]def get(self, request):return Response({"message": "Protected view accessed"})
    
🧩 代码解析
  1. TokenView 和 RevokeTokenView:提供 OAuth2 令牌生成和撤销功能。
  2. OAuth2Authentication:在受保护视图中使用 OAuth2 认证类。
🚀 运行示例

启动 Django 开发服务器,使用 OAuth2 认证生成令牌,并访问受保护的 API 路由以验证 OAuth2 实现。此示例展示了如何在 Django 中集成 OAuth2 和 OpenID Connect。


🛡️ 4. Django 中的用户认证与权限系统

Django 提供了一个强大的用户认证系统,包含用户模型、权限系统和认证视图。通过 Django 的用户认证系统,可以轻松实现用户登录、注册和权限管理。

📌 配置用户认证系统
  1. 创建用户模型:使用 Django 内置的 User 模型或自定义用户模型。
  2. 认证视图:使用 Django 提供的视图处理用户认证。
📌 使用 Django 内置用户模型
python">from django.contrib.auth.models import User
from django.contrib.auth import authenticate, logindef user_login(request):username = request.POST['username']password = request.POST['password']user = authenticate(username=username, password=password)if user is not None:login(request, user)return HttpResponse("Logged in successfully")else:return HttpResponse("Invalid credentials")
📌 权限管理

Django 提供了内置的权限系统,可以定义用户组和权限,并将权限分配给用户。

python">from django.contrib.auth.models import Permission# 创建一个新的权限
permission = Permission.objects.create(codename='can_view_reports',name='Can view reports',content_type=content_type,
)# 分配权限给用户
user.user_permissions.add(permission)
🧩 代码解析
  1. 用户认证authenticatelogin 方法用于验证用户身份和登录。
  2. 权限管理:通过 Permission 模型定义和分配权限。
🚀 运行示例

创建用户、配置权限,并测试用户登录和权限分配功能,展示 Django 强大的用户管理系统。


🚫 5. CSRF/XSS 防护

在 Web 开发中,防护跨站请求伪造(CSRF)和跨站脚本攻击(XSS)是保证应用安全的关键。

📌 CSRF 防护

CSRF 是一种攻击方式,攻击者通过伪造请求来执行未经授权的操作。Django 提供了内置的 CSRF 防护机制。

python">from django.middleware.csrf import CsrfViewMiddleware
from django.shortcuts import render# 启用 CSRF 中间件
MIDDLEWARE = [# 其他中间件'django.middleware.csrf.CsrfViewMiddleware',
]# 在模板中使用 CSRF token
<form method="post">{% csrf_token %}<input type="submit" value="Submit">
</form>
📌 XSS 防护

XSS 攻击通过在网页中注入恶意脚本来窃取信息或破坏应用。Django 模板引擎通过自动转义用户输入来防护 XSS 攻击。

<!-- Django 模板自动转义 -->
<p>{{ user_input }}</p>
🧩 代码解析
  1. CSRF 防护:启用 CsrfViewMiddleware 和在表单中使用 {% csrf_token %} 进行 CSRF 防护。
  2. XSS 防护:Django 模板引擎自动转义用户输入,防止 XSS 攻击。
🚀 运行示例

配置 Django CSRF 和 XSS 防护功能,并测试应用的安全性,确保用户数据的安全和应用的稳健性。

文章来源:https://blog.csdn.net/weixin_52392194/article/details/142219573
http://www.ppmy.cn/news/1525389.html

相关文章

SQLITE3数据库实现信息的增删改查

#include <myhead.h> #include <sqlite3.h> typedef struct { int id; char name[20]; int age; int money; }woker; int callbake(void *arg,int n,char **a,char **b)//回调 输出查找到的工人信息 { for(int i 0;i<n;i) { …

手撕Python之正则

1.正则和re模块的联系 正则表达式是一种通用的用来简洁表达一组字符串的表达式&#xff0c;利用正则表达式可以方便快捷的匹配和筛选字符串 举个例子&#xff1a;在一堆数据中进行电话号码的寻找&#xff0c;我们需要根据电话号码的特征在这一堆数据进行电话的寻找&#xff0…

贪心算法之找零钱问题详细解读(附带Java代码解读)

找零钱问题&#xff08;Change-making Problem&#xff09;是计算机科学中一个经典的问题&#xff0c;特别是在贪心算法的背景下非常常见。问题可以简单描述为&#xff1a; 给定一个目标金额和若干种不同面额的硬币&#xff0c;如何使用最少数量的硬币组合来凑齐目标金额。 找零…

电力系统调度控制台的功能有哪些

在复杂多变的现代电力系统中&#xff0c;调度控制台作为其核心管理与控制的中枢&#xff0c;扮演着不可或缺的角色。它不仅是确保电网安全稳定运行的关键&#xff0c;也是实现电力资源高效配置的重要工具。那么&#xff0c;电力系统调度控制台究竟具备哪些关键功能呢? 首先&am…

Kubernetes 与 springboot集成

Kubernetes 与 Spring Boot 集成详解 Kubernetes&#xff08;简称 K8s&#xff09;是一个用于自动化部署、扩展和管理容器化应用的开源平台&#xff0c;而 Spring Boot 是 Java 开发领域中非常流行的微服务框架。将这两者结合&#xff0c;可以充分利用 Kubernetes 强大的容器编…

【Linux 从基础到进阶】Docker 容器技术基础与应用

Docker 容器技术基础与应用 Docker 是一种开源的容器化平台,它使得开发人员能够自动化应用程序的部署、管理和隔离。通过容器技术,Docker 提供了一种轻量级的虚拟化解决方案,与传统的虚拟机相比,容器的启动速度更快,占用资源更少,因此广泛应用于现代 DevOps 流程和微服务…

类和对象(中)【上篇】(构造,析构,拷贝函数)

&#x1f31f;个人主页&#xff1a;落叶 目录 类的默认成员函数 构造函数 无参构造 带参构造函数 全缺省构造函数 析构函数 对⽐C和C解决括号匹配问题 C语言版的Stack C版的Stack 拷⻉构造函数 类的默认成员函数 默认成员函数就是⽤⼾没有显式实现&#xff0c;编译器会…

《JavaEE进阶》----11.<SpringIOCDI【Spring容器+IOC详解+DI介绍】>

本篇博客会详细讲解什么是Spring。 SpringIOC SpringID 五个类注解&#xff1a;Controller、Service、Repository、Component、Configuration 一个方法注解&#xff1a;Bean 什么是Spring IOC容器 Spring 是包含众多工具的IOC容器。能装东西的容器。 1.容器 如我们之前学的 Tom…