fastapi-learning-notes/codes/ch01/main.py at master · Relph1119/fastapi-learning-notes · GitHub
1、Cookie的作用
Cookie可以充当用户认证的令牌,使得用户在首次登录后无需每次手动输入用户名和密码,即可访问受限资源,直到Cookie过期或被手动清除。
2、查找Cookie
Google Chrome:
- 打开Chrome浏览器。
- 右上角点击三个点形成的菜单图标,选择“更多工具” > “开发者工具”(也可以直接按F12或Ctrl+Shift+I快捷键)。
- 在开发者工具窗口中,点击顶部的“Application”选项卡。
- 在左侧导航栏,展开“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)