Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oauth 2.0 如何在fastapi中使用刷新令牌获取访问令牌_Oauth 2.0_Fastapi - Fatal编程技术网

Oauth 2.0 如何在fastapi中使用刷新令牌获取访问令牌

Oauth 2.0 如何在fastapi中使用刷新令牌获取访问令牌,oauth-2.0,fastapi,Oauth 2.0,Fastapi,我想实现刷新令牌端点。然而,我不知道如何使用刷新令牌来获取访问令牌。我在这里生成了刷新令牌,它位于登录/访问令牌端点中。我是否首先需要存储此刷新令牌,或者客户端必须发送它 我也不确定这是否是生成以下刷新令牌的正确方法 @app.post(“/login/access token”,response\u model=schema.token) def login(dbs:Session=Depends(get_db),form_data:OAuth2PasswordRequestForm=Depe

我想实现刷新令牌端点。然而,我不知道如何使用刷新令牌来获取访问令牌。我在这里生成了刷新令牌,它位于登录/访问令牌端点中。我是否首先需要存储此刷新令牌,或者客户端必须发送它

我也不确定这是否是生成以下刷新令牌的正确方法

@app.post(“/login/access token”,response\u model=schema.token)
def login(dbs:Session=Depends(get_db),form_data:OAuth2PasswordRequestForm=Depends())->任意:
"""
OAuth2兼容令牌登录,为将来的请求获取访问令牌
"""
打印('In login')
user=crud.authenticate(
dbs,email=form_data.username,password=form_data.password
)
#打印('登录用户',用户)
如果不是用户:
引发HTTPException(状态\代码=400,详细信息=“不正确的电子邮件或密码”)
elif未积垢。是否处于活动状态(用户):
引发HTTPException(状态代码=400,详细信息=“非活动用户”)
访问令牌过期=时间增量(分钟=设置。访问令牌过期分钟)
用户数据={
“user\u id”:user.id,
“电子邮件”:user.email,
“提供程序类型”:user.provider\u类型,
'is_active':user.is_active,
'is_super_user':user.is_super_user
}
打印('在标记后登录')
access\u token=security.create\u access\u token(
user.id,expires\u delta=access\u token\u expires
)
refreshdata={'token\u type':'refresh','user\u id':user.id}
刷新\u令牌=安全性。创建\u访问\u令牌(
refreshdata,expires\u delta=timedelta(天=设置。刷新\u令牌\u EXPIRE\u天)
)
#打印(“刷新令牌”,刷新令牌)
返回{
#“访问令牌”:security.create\u访问令牌(
#user.id,expires\u delta=access\u token\u expires
# ),
“访问令牌”:访问令牌,
“刷新令牌”:刷新令牌,
“令牌类型”:“承载者”,
“用户”:用户数据
}
我就是这样做的

@app.post(“/refresh token”,response\u model=schema.token)
def refresh_令牌(请求:schema.TokenItem,dbs:Session=Depends(get_db)):
刷新\u令牌=请求。刷新\u令牌
#打印(“刷新数据”,刷新数据)
令牌\u用户=crud。从\u刷新\u令牌(dbs,刷新\u令牌=刷新\u令牌)获取\u访问权\u
登录\令牌=依赖项。创建\登录\令牌(用户=令牌\用户,刷新\令牌=刷新\令牌)
返回登录令牌
def从刷新令牌获取访问令牌(db:Session,刷新令牌:str):
#打印('获取访问令牌',刷新令牌)
有效负载=jwt.decode(刷新令牌,设置.SECRET\u密钥,算法=[settings.ALGORITHM])
token_data=schema.TokenPayload(**有效载荷)
token\u user=get\u user(db,user\u id=token\u data.sub)
返回令牌\u用户
def创建登录令牌(用户:models.user,刷新令牌:str):
访问令牌过期=时间增量(分钟=设置。访问令牌过期分钟)
用户数据={
“user\u id”:user.id,
“电子邮件”:user.email,
“提供程序类型”:user.provider\u类型,
'is_active':user.is_active,
'is_super_user':user.is_super_user
}
access\u token=security.create\u access\u token(
user.id,expires\u delta=access\u token\u expires
)
返回{
“访问令牌”:访问令牌,
“刷新令牌”:刷新令牌,
“令牌类型”:“承载者”,
“用户”:用户数据
}

我看到了这个解决方案,但这种方法的问题是,如果我当前的访问令牌本身过期了怎么办。