Python fastapi 单点登录

想知道 Python用fastapi加jwt认证怎么实习单点登录啊,自己看了很多文章还是不懂 有没有健全的文章啊加上完整代码的

【以下回答由 GPT 生成】

解决方案

实现单点登录(Single Sign-On, SSO)可以使用FastAPI和JWT来完成。以下是一个用FastAPI和JWT实现单点登录的示例代码:

# 安装所需的库
# pip install fastapi[all] pyjwt

from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import OAuth2PasswordRequestForm, OAuth2PasswordBearer
from datetime import datetime, timedelta
from jwt import PyJWTError, encode, decode

# 配置参数
JWT_SECRET = "secret"
JWT_ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

# 假设的用户数据库
USERS = {
    "user1": {
        "password": "pass1",
        "name": "User One"
    },
    "user2": {
        "password": "pass2",
        "name": "User Two"
    }
}

# 创建FastAPI实例
app = FastAPI()

# 创建JWT工具函数

def create_access_token(data: dict, expires_delta: timedelta):
    to_encode = data.copy()
    expire = datetime.utcnow() + expires_delta
    to_encode.update({"exp": expire})
    encoded_jwt = encode(to_encode, JWT_SECRET, algorithm=JWT_ALGORITHM)
    return encoded_jwt

def decode_access_token(token: str):
    try:
        payload = decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
        username: str = payload.get("sub")
        if username is None:
            raise HTTPException(status_code=400, detail="Invalid token")
        return username
    except PyJWTError:
        raise HTTPException(status_code=401, detail="Invalid token")

# JWT依赖项
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

# 定义登录路由
@app.post("/token")
def login(form_data: OAuth2PasswordRequestForm = Depends()):
    username = form_data.username
    password = form_data.password
    if username not in USERS or USERS[username]["password"] != password:
        raise HTTPException(status_code=400, detail="Incorrect username or password")

    access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    access_token = create_access_token(
        data={"sub": username},
        expires_delta=access_token_expires
    )
    return {"access_token": access_token, "token_type": "bearer"}

# 定义需要登录的路由
@app.get("/protected_route")
def protected_route(token: str = Depends(oauth2_scheme)):
    username = decode_access_token(token)
    user_data = USERS[username]
    return {"message": f"Hello, {user_data['name']}!"}

这个示例代码中包含了一个登录路由(/token)和一个需要登录才能访问的保护路由(/protected_route)。

用户可以通过发送POST请求到登录路由/token来获取访问令牌(access_token),该令牌在后续请求中用于验证用户身份。登录路由使用OAuth2PasswordRequestForm类来获取表单数据。

保护路由(/protected_route)需要使用用户的访问令牌来验证用户身份。访问令牌通过Depends(oauth2_scheme)参数传递给路由函数,并使用decode_access_token函数来验证令牌并获取用户名。

以上代码仅是一个示例,你可以根据自己的需求进行修改和扩展。

希望这个示例能帮助你更好地理解和实现单点登录功能。如果你有任何问题,请随时向我提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^