FastAPI-Cookie

发布于:2024-07-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

fastapi-learning-notes/codes/ch01/main.py at master · Relph1119/fastapi-learning-notes · GitHub

1、Cookie的作用

Cookie可以充当用户认证的令牌,使得用户在首次登录后无需每次手动输入用户名和密码,即可访问受限资源,直到Cookie过期或被手动清除。

2、查找Cookie

Google Chrome:

  1. 打开Chrome浏览器。
  2. 右上角点击三个点形成的菜单图标,选择“更多工具” > “开发者工具”(也可以直接按F12或Ctrl+Shift+I快捷键)。
  3. 在开发者工具窗口中,点击顶部的“Application”选项卡。
  4. 在左侧导航栏,展开“Cookies”部分,选择您想查看的网站域名。


 3、Cookie代码

下面这段代码使用FastAPI框架实现了一个简单的用户登录和用Cookie进行用户认证

  • 首先定义了一个User模型类,用于表示用户信息。
  • 创建了一个模拟的用户数据库fake_users_db,其中包含5个用户及其密码。
  • 定义了一个active_tokens字典,用于存储有效的会话令牌及其对应的用户名。
  • get_current_user函数用于验证Cookie中的会话令牌是否有效。如果有效,则返回对应的用户名;否则抛出HTTPException,表示无效的会话令牌。
  • login路由处理函数用于处理用户登录请求。首先验证用户凭据是否正确,如果正确,则生成一个随机的会话令牌,并将其与用户名关联起来,存储在active_tokens中。然后将该令牌设置为Cookie,并返回登录成功的信息以及相关数据。
  • protected_route路由处理函数是一个受保护的路由,只有携带有效会话令牌的请求才能访问。该函数依赖于get_current_user函数来验证用户身份,并返回欢迎信息。

最后,在主函数中使用uvicorn启动FastAPI应用程序。根据不同的模式,可以选择线上模式或调试模式运行

import secrets
import uvicorn
from fastapi import FastAPI, Depends, Cookie, HTTPException, Response
from pydantic import BaseModel

app = FastAPI()


# 用户模型
class User(BaseModel):
    username: str
    password: str


# 模拟的用户数据库,现在包含5个用户
fake_users_db = {
    "john_doe": {"username": "john_doe", "password": "secret_john"},
    "jane_smith": {"username": "jane_smith", "password": "secret_jane"},
    "alice": {"username": "alice", "password": "secret_alice"},
    "bob": {"username": "bob", "password": "secret_bob"},
    "charlie": {"username": "charlie", "password": "secret_charlie"}
}

# 假设这是存储token与其对应用户的简单字典
active_tokens = {}


def get_current_user(session_token: str = Cookie(None)):
    """
    验证Cookie中的session_token是否有效,这里是简化的版本,实际应用中应该有更安全的验证机制。
    """
    user = active_tokens.get(session_token)
    if user is not None:
        return user
    else:
        raise HTTPException(status_code=401, detail="Invalid session token")


@app.post("/login")
async def login(response: Response, user: User):
    if user.username in fake_users_db and user.password == fake_users_db[user.username]["password"]:
        token = secrets.token_hex(16)
        active_tokens[token] = user.username  # 将生成的token与用户名关联起来
        print("active_tokens:", active_tokens)
        response.set_cookie(key="session_token", value=token, max_age=60 * 60 * 24)
        return {"username": user.username,
                "password": user.password,
                "token": token,
                "active_tokens": active_tokens,
                "message": f"Login successful for user {user.username}"}

    else:
        raise HTTPException(status_code=401, detail="Incorrect username or password")


@app.get("/protected-route")
async def protected_route(user: str = Depends(get_current_user)):
    """
    受保护的路由,只有携带有效Cookie的请求才能访问
    """
    return {"message": f"Welcome back, {user}!"}


# 主函数,用于启动FastAPI应用程序
if __name__ == "__main__":
    ## 线上模式
    # uvicorn.run("abr_server:app", host="0.0.0.0", port = 1218)

    ## debug 模式
    uvicorn.run("test5:app", host="0.0.0.0", port=1220, reload=True)