fastapi - get_current_user 不起作用(OAuth2PasswordBearer 问题)
问题描述
这实际上是第一次不起作用,我的意思是我以前练习过,但现在我不知道出了什么问题。
所以我正在尝试实现get_current_user
FastAPI 的基本功能,但不知何故它不起作用。
当我尝试招摇授权时,授权工作正常,但当前用户的端点根本不起作用。
所以这是属于端点文件的部分:
router = APIRouter(prefix='/api/v1/users')
router1 = APIRouter()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl='/api-token-auth/')
@router1.post('/api-token-auth/')
async def auth(form: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
user = await utils.get_user_by_username(form.username, db) # type: User
if not user:
raise HTTPException(status_code=400, detail="Incorrect username or password")
if not utils.validate_password(form.password, user.hashed_password):
raise HTTPException(status_code=400, detail="Incorrect username or password")
return await utils.create_token(user.id, db)
async def get_current_user(token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)):
print(token)
user = await utils.get_user_by_token(token, db)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return user
@router.get("/me", response_model=DisplayUser)
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
这是创建令牌的函数(我已经检查过,它 1000% 有效并返回字符串):
async def create_token(user_id: int, db: Session):
"""Token generation"""
letters = string.ascii_lowercase
token = ''.join(random.choice(letters) for _ in range(25))
created_token = Token(
expires=datetime.now() + timedelta(weeks=2),
user_id=user_id,
token=token
)
db.add(created_token)
db.commit()
db.refresh(created_token)
token = AuthUser.from_orm(created_token)
return token.token
但是当我print(token)
在get_current_user
运行时它会打印undefined
. 我不知道为什么。我使用依赖错误还是什么?
提前致谢!
解决方案
由于它打印 undefined ,因此前端似乎期望以不同的格式响应(因为 undefined 是在 Javascript 中使用未定义的对象键作为键将导致的结果)。
默认情况下, OAuth2 响应应具有以下令牌access_token
:
access_token(必需)授权服务器颁发的访问令牌字符串。
token_type(必需)这是令牌的类型,通常只是字符串“bearer”。
来自上述链接的示例响应:
{
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
"scope":"create"
}