专业的JAVA编程教程与资源

网站首页 > java教程 正文

Python Web:如何通过JWT实现单点登录?

temp10 2024-11-20 21:46:09 java教程 12 ℃ 0 评论

前面2篇文章,钢铁老豆和大家讨论了JWT、Redis缓存会话ID的对比,以及单点登录(SSO)的主流方案,那么我们这节就来讲讲在Python主流的Web服务器框架下,比如Django、Flask、FastAPI,如何才能通过JWT实现单点登录。

什么是JWT?

JSON Web Tokens(JWT)是一种开放标准(RFC 7519),提供了一种简洁(对于URL安全)、自包含的方法,用于在各方之间以JSON对象的形式安全地传输信息。每个JWT包含了加密的信息,可以验证发送方的身份和声明的真实性。JWT主要由三部分组成:

Python Web:如何通过JWT实现单点登录?

  • Header(头部):通常包含了令牌的类型(即JWT)和所使用的加密算法,如HMAC SHA256或RSA。
  • Payload(负载):存放有效信息的地方。这些信息包括但不限于用户身份信息、令牌的发行者、过期时间等。负载中的声明可以是公共的、私有的,也可以是注册的。
  • Signature(签名):为了防止信息被篡改,会对前两部分进行签名。如果使用的是HMAC算法,那么还需要一个密钥。

JWT实现单点登录SSO的步骤

在单点登录系统中,JWT扮演了极其关键的角色。通过JWT,用户在一个系统中的登录信息可以被其他所有系统所信任,从而实现一次登录,多个系统通行的效果。这不仅大幅提升了用户体验,还提高了安全性,因为JWT的传输是加密的,能有效防止信息被篡改。

首先,我们先讲讲实现大致的步骤:

  • 身份验证服务器的设置:首先需要一个中心身份验证服务器,这个服务器负责用户的登录认证并生成JWT。
  • 登录过程:用户首次访问任一应用时,会被重定向到认证服务器进行登录。成功登录后,服务器会生成一个包含用户信息的JWT。
  • 使用JWT访问其他应用:用户随后访问其他应用时,只需提供JWT即可。每个应用都会对JWT进行验证,确认用户身份后,无需再次登录,即可访问服务。

Django、Flask、FastAPI里有关于JWT或者SSO的API吗?

在Django、Flask和FastAPI这三个流行的Python web框架中,都可以实现JWT或SSO的功能,但它们本身不直接包含JWT或SSO的API。通常,你需要使用第三方库来集成这些功能。下面钢铁老豆就分别介绍每个框架常用的一些库和实现方式:

Django

对于JWT认证,有一个流行库叫djangorestframework-simplejwt。这个库与Django REST Framework一起工作,提供了全面的JWT支持。

# 安装方式
pip install djangorestframework-simplejwt

# 快速示例
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
from django.urls import path

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

对于SSO,django-allauth则是一个提供社交账号认证的解决方案,它支持通过多种第三方服务(如Google、Facebook等)实现单点登录。

# 安装方式
pip install django-allauth

Flask

对于JWT认证,flask-jwt-extended是实现JWT认证的主流选择之一。它提供了许多有用的功能,如创建和验证JWTs、设置令牌的过期时间等。

# 安装方式
pip install flask-jwt-extended

# 快速示例
from flask import Flask
from flask_jwt_extended import JWTManager

app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret'  # Change this!
jwt = JWTManager(app)

对于SSO,Flask没有一个统一的标准库,但你可以使用authlib库来集成OAuth 2.0支持,实现与各种社交平台的连接。

# 安装方式
pip install authlib

FastAPI

钢铁老豆以前使用的Flask部署服务,不过现在已经改用FastAPI这个基于协程的异步服务器老六,性能比Flask快不是一星半点。虽然一般内部的模型服务,不需要使用特别的身份认证,但公司或者业务大了,还是需要的。

对于JWT认证,我们可以通过fastapi-jwt-auth来实现。这个库提供了FastAPI专用的JWT支持。

# 安装方式
pip install fastapi-jwt-auth

# 快速示例
from fastapi import FastAPI, Depends
from fastapi_jwt_auth import AuthJWT

app = FastAPI()

@AuthJWT.load_config
def get_config():
    return {'authjwt_secret_key': 'secret'}

@app.post('/login')
def login(authorize: AuthJWT = Depends()):
    authorize.create_access_token(subject='user_id')
    return {"access_token": authorize.get_raw_jwt()}

对于SSO,你可以使用authlib库与FastAPI一起使用,它也支持OAuth和JWT的功能。

无论你选择什么服务器框架,通常都需要将这些库与其他用户认证和授权逻辑相集成,以实现完整的安全系统。根据项目的具体需求和已有的技术栈,选择合适的库和框架非常关键。

欢迎点赞+收藏+评论+关注,每天学习一点Python小知识,无论基础、模块、数据分析、深度学习Ai,总有你感兴趣的。另外,想咨询转行IT算法入门的朋友,欢迎关注后私聊。我是钢铁老豆,一个30岁转行IT、自学成为算法工程师、想用Ai点亮孩子小小世界的Pythoner。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表