想知道 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
函数来验证令牌并获取用户名。
以上代码仅是一个示例,你可以根据自己的需求进行修改和扩展。
希望这个示例能帮助你更好地理解和实现单点登录功能。如果你有任何问题,请随时向我提问。
【相关推荐】