qqkjjbs 2023-08-06 11:00 采纳率: 0%
浏览 9

Python fastapi 单点登录

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-06 12:20
    关注

    【以下回答由 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函数来验证令牌并获取用户名。

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

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



    【相关推荐】



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

报告相同问题?

问题事件

  • 创建了问题 8月6日

悬赏问题

  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
  • ¥15 开发一个类似百度网盘的软件,在主页 文件列表点击进入文件夹,在文件夹里面还有文件夹,代码该怎么写?
  • ¥30 使用matlab将观测点聚合成多条目标轨迹
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据