Oauth 2.0 如何将刷新令牌与KeyClope和Fastapi一起使用?

Oauth 2.0 如何将刷新令牌与KeyClope和Fastapi一起使用?,oauth-2.0,keycloak,openid-connect,fastapi,refresh-token,Oauth 2.0,Keycloak,Openid Connect,Fastapi,Refresh Token,我正在使用内置的Oauth2 fastapi模块联系KeyClope令牌端点并获取访问令牌 在KeyClope中,我有一个具有openid连接和机密访问类型的客户端,并且启用了客户端凭据流。这看起来更适合我的项目,因为它是一个服务器到服务器api 在我的python应用程序中,我有一个直接从Fastapi中的Oauth2ClientCredentials继承的Oauth2类,还有一个依赖于我的客户端凭证Oauth2方案的身份验证方法 所有这些都可以完美地获取访问令牌,并使用它安全地访问我的api

我正在使用内置的Oauth2 fastapi模块联系KeyClope令牌端点并获取访问令牌

在KeyClope中,我有一个具有openid连接和机密访问类型的客户端,并且启用了客户端凭据流。这看起来更适合我的项目,因为它是一个服务器到服务器api

在我的python应用程序中,我有一个直接从Fastapi中的Oauth2ClientCredentials继承的Oauth2类,还有一个依赖于我的客户端凭证Oauth2方案的身份验证方法

所有这些都可以完美地获取访问令牌,并使用它安全地访问我的api资源。但是,我找不到一种方法在fastapi中使用KeyClope刷新令牌

我发现不建议在客户端凭据流中使用刷新令牌,但我对其他KeyClope流也有同样的问题

为了使用Postman检索刷新令牌,我尝试在KeyClope管理控制台中的客户机的兼容性模式部分中激活使用刷新令牌进行客户机凭据授予,这起到了作用。 我还尝试在oauth2_方案中填充refreshUrl,以查看oauth2的Fastapi实现是否能够自动获取刷新令牌并请求新的访问令牌,但没有成功

Fastapi似乎没有内置的Oauth2方法来自动从外部身份提供程序获取和使用刷新令牌,而且我无法在Fastapi中检索刷新令牌以手动编写不太干净的代码来使用它

我不想在我的项目中使用PythonKey斗篷包,因为如果我想,它也应该能够与其他身份提供者一起工作。我需要继续在我的应用程序中使用fastapi

您知道一种干净的方法,当前一个访问令牌在Fastapi和KeyClope中过期时,使用刷新令牌自动请求新的访问令牌吗?还是一种手工编码的方法?我花了很多时间检查所有文档和其他stackoverflow帖子,以找到如何做到这一点,但我没有发现任何真正准确的东西

身份验证和授权模块:

根据fastapi导入、HTTPException和状态 从fastapi.security导入SecurityScopes 导入json 进口jwt 从jwt导入PyJWKClient 从模型导入令牌数据,Oauth2ClientCredentials 从配置导入openid\u auth 从config.logger导入记录器 从键入导入可选 oauth2_scheme=Oauth2ClientCredentials tokenUrl=openid\u auth.ACCESS\u TOKEN\u URL, refreshUrl=openid\u auth.ACCESS\u TOKEN\u URL def_authorizetoken_数据:TokenData,安全性_作用域:安全性作用域,身份验证_值:str: 检查用户权限 如果没有足够的权限使用请求的资源,则引发异常 对于security_scopes.scopes中的作用域: 如果作用域不在token_data.scopes中: 引发HTTPException status\u code=status.HTTP\u 401\u未经授权, 详细信息=权限不足, 头文件={WWW-Authenticate:Authenticate\u-value}, 返回真值 异步def authenticatesecurity\u作用域:SecurityScopes,令牌:str=Dependsoauth2\u方案: 检查KeyClope服务器生成的访问令牌 从浏览器客户端获取请求的令牌并从中提取数据 如果安全性_作用域。作用域: authenticate_value=f'Bearer scope={security_scopes.scope_str}' 其他: 验证值=fBear 尝试: jwk_client=PyJWKClientopenid_auth.keydove_证书 signing_key=jwk_client.get_signing_key_from_jwttoken payload=jwt.decodetoken,signing_key.key,algorithms=[openid_auth.ALGORITHM],options={verify_aud:False} 除jwt.ExpiredSignatureError外: 引发HTTPException status\u code=status.HTTP\u 401\u未经授权, detail=令牌已过期。请更新您的代币。, 头文件={WWW-Authenticate:Authenticate\u-value}, 例外情况除外,如e: 引发HTTPException status\u code=status.HTTP\u 401\u未经授权, 详细信息=无法分析身份验证令牌。+斯特雷, 头文件={WWW-Authenticate:Authenticate\u-value}, 用户名:可选[str]=payload.getsub 如果用户名为“无”: 引发HTTPException status\u code=status.HTTP\u 401\u未经授权, 详细信息=无法验证凭据, 头文件={WWW-Authenticate:Authenticate\u-value}, 令牌\范围=有效负载[领域\访问][角色] 令牌\数据=令牌数据范围=令牌\范围,用户名=用户名 如果授权令牌数据、安全范围、身份验证值: 返回令牌数据 下面是我的Oauth2ClientCredentials类,它基于Fastapi的其他Oauth2实现:

输入import Dict,可选 从fastapi.Exception导入HTTPException 从fastapi.security导入OAuth2 从快 api.openapi.models将OAuthFlows作为OAuthFlowsModel导入 从fastapi.security.utils导入获取授权方案参数 从starlette.requests导入请求 从starlette.status导入HTTP\u 401\u未经授权 fastapi客户端凭据流的实现 类Oauth2ClientCredentialsOAuth2: 定义初始化__ 自己 tokenUrl:str, refreshUrl:可选[str]=无, 方案名称:可选[str]=None, 作用域:可选[Dict[str,str]]=None, 自动_错误:bool=True, : 如果不是范围: 作用域={} 流量=OAuthFlowsModel clientCredentials={tokenUrl:tokenUrl,scopes:scopes} super.\uuuuu init\uuuuu flows=flows,scheme\u name=scheme\u name,auto\u error=auto\u error 异步定义调用self,请求:请求->可选[str]: 授权:str=request.headers.getAuthorization scheme,param=get\u authorization\u scheme\u paramauthorization 如果不是授权或scheme.lower!=持票人: 如果self.auto\u错误: 引发HTTPException 状态代码=HTTP\u 401\u未经授权, 详细信息=未经验证, 头文件={WWW-Authenticate:Bearer}, 其他: 一无所获 返回参数
使用此选项不适合您


我即将用这个来实现它。

这些属性和教程不能帮助我用fastapi实现一个只使用KeyClope REST api的刷新令牌。但是谢谢你的尝试