get_current_user不起作用(OAuth2密码持有者问题)



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

因此,我试图为FastAPI实现基本函数get_current_user,但不知何故,它不起作用。

当我尝试swagger时,授权工作得很好,但使用当前用户的端点根本不起作用。

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

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

但当我在get_current_user函数中使用print(token)时,它会打印undefined。我不知道为什么。我使用依赖关系是错误的还是什么?

提前感谢!

因为它打印的是未定义的,所以前端似乎期望以不同的格式响应(因为在Javascript中使用未定义的对象键作为键会导致未定义(。

默认情况下,OAuth2响应应具有access_token下的令牌:

access_token(必需(由授权服务器发布的访问令牌字符串。

token_type(必需(令牌的类型,通常只是字符串"bearer"。

来自上述链接的示例响应:

{
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
"token_type":"bearer",
"expires_in":3600,
"refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
"scope":"create"
}

在您的"create_token(user.id,db("确保返回的令牌包含这两个值。{"access_token":";,"token_type":"载体";}

最新更新