Fastapi密码授权相关

Fastapi密码授权相关

主要实现获取token,前端携带token请求

"""
密码授权相关
"""

from fastapi import APIRouter, Depends, Header, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from pydantic import BaseModel
from passlib.context import CryptContext
from typing import List, Optional
from datetime import datetime, timedelta
import jwt


auth_app = APIRouter()

# JWT 配置 密钥
SECRET_KEY = "Model"
# 加密算法
ALGORITHM = "HS256"
# token失效时间
ACCESS_TOKEN_EXPIRE_MINUTES = 30

# 密码哈希配置
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# OAuth2 配置
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

hashed_password = pwd_context.hash('123456')
print(hashed_password)

# 定义数据
fake_users_db = {
   
   
    "haha": {
   
   
        "username": "haha",
        "password": 123456,
        "hashed_password": hashed_password,
        "disabled": False
    },
    "james": 
<think>好的,用户想在FastAPI中实现Token授权认证,我需要根据之前提供的引用内容来构建回答。首先,我得回忆一下FastAPI的认证机制,特别是OAuth2的相关部分。 用户提到的引用[1]提到了Depends和OAuth2PasswordBearer,引用[2]详细说明了如何创建OAuth2PasswordBearer实例,引用[3]则讨论了OAuth2.0的流程和FastAPI的实现。所以,我需要整合这些信息,提供一个清晰的步骤说明和示例。 首先,应该介绍OAuth2PasswordBearer的作用,解释tokenUrl参数的意义,比如指定获取token的路径。然后,需要说明如何创建依赖项来验证token,这部分可能需要使用JWT或者其他验证方式。接着,示例代码是关键,要展示如何定义路由,保护端点,以及生成token的逻辑。 可能还需要提到密码哈希处理,比如使用passlib库,以及如何生成和验证JWT令牌。此外,安全注意事项,比如HTTPS的必要性和token有效期,也是需要涵盖的点。 用户可能对具体的实现步骤和代码示例比较关注,所以需要分步骤讲解,确保每个部分都有对应的代码块。同时,要检查是否符合LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,主要注意代码块的格式。 最后,生成的相关问题要围绕FastAPI的认证机制展开,比如其他授权方式、JWT配置、刷新令牌等,确保问题有针对性,帮助用户深入理解。</think>在FastAPI中实现Token授权认证可通过OAuth2协议实现,以下是详细步骤和示例: ### 一、核心实现步骤 1. **安装依赖** ```bash pip install fastapi uvicorn python-jose[cryptography] passlib ``` 2. **创建OAuth2密码流实例** ```python from fastapi.security import OAuth2PasswordBearer oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") # 定义获取token的端点[^2] ``` 3. **用户认证逻辑** ```python from passlib.context import CryptContext pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def verify_password(plain_pwd, hashed_pwd): return pwd_context.verify(plain_pwd, hashed_pwd) def get_user(db, username: str): if username in db: return UserInDB(**db[username]) ``` 4. **Token生成与验证** ```python from jose import JWTError, jwt SECRET_KEY = "your-secret-key" ALGORITHM = "HS256" def create_access_token(data: dict): return jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM) async def get_current_user(token: str = Depends(oauth2_scheme)): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) return payload.get("sub") except JWTError: raise HTTPException(status_code=401, detail="Invalid token") ``` ### 二、完整示例代码 ```python from fastapi import FastAPI, Depends, HTTPException from pydantic import BaseModel app = FastAPI() # 模拟数据库 fake_users_db = { "john": { "username": "john", "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW" } } class User(BaseModel): username: str class UserInDB(User): hashed_password: str @app.post("/token") async def login(form_data: OAuth2PasswordRequestForm = Depends()): user = get_user(fake_users_db, form_data.username) if not user or not verify_password(form_data.password, user.hashed_password): raise HTTPException(status_code=400, detail="Invalid credentials") return {"access_token": create_access_token({"sub": user.username})} @app.get("/protected/") async def read_protected_data(current_user: User = Depends(get_current_user)): return {"message": f"Hello {current_user}"} ``` ### 三、安全注意事项 1. 必须使用HTTPS传输 2. 设置合理的Token过期时间(可增加exp字段) 3. 密钥需通过环境变量注入,避免硬编码 4. 推荐使用非对称加密算法(如RS256)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BRYTLEVSON

打赏的都是天使,创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值