首页 > 解决方案 > get_current_user 不起作用(OAuth2PasswordBearer 问题)

问题描述

这实际上是第一次不起作用,我的意思是我以前练习过,但现在我不知道出了什么问题。

所以我正在尝试实现get_current_userFastAPI 的基本功能,但不知何故它不起作用。

当我尝试招摇授权时,授权工作正常,但当前用户的端点根本不起作用。

所以这是属于端点文件的部分:

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. 我不知道为什么。我使用依赖错误还是什么?

提前致谢!

标签: fastapi

解决方案


由于它打印 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"
}

推荐阅读