fastapi-login/main.py
2024-01-23 19:30:28 +08:00

62 lines
1.9 KiB
Python

import uvicorn
from passlib.context import CryptContext
from fastapi import FastAPI, HTTPException, Request
from models.User import *
from models.Token import *
from controllers.JWT import secret_key
from starlette.responses import Response
app = FastAPI()
pwd_context = CryptContext(schemes=["bcrypt"])
# 模拟数据库中的用户
users_db = {
"admin": {
"username": "admin",
"password": pwd_context.hash("admin123")
}
}
@app.get("/")
async def index(request: Request, response: Response,):
cookie = request.headers.get("Cookie")
if cookie is None:
token = await generate_token("guest")
response.set_cookie("token", token)
return {"code": 200, "status": "success"}
@app.post("/login")
async def login(request: Request, response: Response, user: UserLogin):
if user.username not in users_db:
raise HTTPException(status_code=401, detail="Invalid username")
stored_user = users_db[user.username]
if not pwd_context.verify(user.password, stored_user["password"]):
raise HTTPException(status_code=401, detail="Invalid password")
token = await generate_token(user.username)
response.set_cookie("token", token)
return {"code": 200, "status": "success"}
@app.get("/users/me")
async def get_user_profile(request: Request):
cookie = request.headers.get("Cookie")
token = await get_token_from_cookie(cookie)
if token is None:
raise HTTPException(status_code=401, detail="Token is required")
try:
payload = jwt.decode(token, secret_key, algorithms=["HS256"])
username = payload["username"]
if username not in users_db:
raise HTTPException(status_code=401, detail="Invalid username")
return {"username": username}
except jwt.DecodeError:
raise HTTPException(status_code=401, detail="Invalid token")
if __name__ == '__main__':
uvicorn.run(app='main:app', host="0.0.0.0", port=80, reload=True)