Google Endpoints错误:Firebase ID令牌具有不正确的;澳元;(观众)要求。预期。。。但是得到
我见过类似的问题,但我的用例似乎不同。让我解释一下Google Endpoints错误:Firebase ID令牌具有不正确的;澳元;(观众)要求。预期。。。但是得到,firebase,firebase-authentication,google-cloud-functions,google-cloud-endpoints,google-cloud-endpoints-v2,Firebase,Firebase Authentication,Google Cloud Functions,Google Cloud Endpoints,Google Cloud Endpoints V2,我见过类似的问题,但我的用例似乎不同。让我解释一下 我只有一个项目 我正在项目中使用Firebase身份验证 我已经创建了一个基于Node JS的http云函数,用于不同的路由 我使用Postman向云功能发出POST请求,使用登录路由,传递电子邮件和密码,并在响应中获取令牌 使用Postman,我向云函数发出POST请求,并通过传递先前请求中的令牌来使用检查路由,并对令牌进行身份验证。它起作用了。为此,我使用firebase admin客户端的admin.auth().verifyIdToke
登录
路由,传递电子邮件和密码,并在响应中获取令牌
使用Postman,我向云函数发出POST请求,并通过传递先前请求中的令牌来使用检查
路由,并对令牌进行身份验证。它起作用了。为此,我使用firebase admin客户端的admin.auth().verifyIdToken
函数
一切似乎都很好
现在,当我在同一个项目中设置Google云端点(在Google云运行容器上)时,并且:
login
path向谷歌云端点发送请求,我会像以前一样收到令牌检查路径的端点发出POST请求时,我收到“Firebase ID令牌具有不正确的“aud”(观众)声明。”错误
app.use(cors())
)设置了我的node js函数,但同样的错误仍然存在
在过去的4-5天里,我一直在研究它,但似乎没有发现确切的问题是什么,为什么它不能接受管理客户端函数调用。任何人给我一个追求的方向,我都将不胜感激。谢谢。我的观察结果是,通过请求头发送的令牌在被Yaml文件路径中指定的Google函数处理之前,会被Google Endpoints服务器更改 我在头和正文中发送了令牌,通过比较发现值不同
当我使用通过主体发送的令牌时,firebase管理客户端发现它是一个有效id,而当我使用来自请求头的令牌时,它给出了上述错误 是,ESP和ESPv2将自动使用新令牌覆盖
授权
标题。这适用于后端云运行服务或云功能需要身份验证的用例
您可以使用disable\u auth
在x-google-backend
中禁用此自动令牌覆盖。
但是,您的后端仍然可以在不禁用此功能的情况下接收原始令牌。从:
因此,如果API客户端设置了授权头,则运行在ESPv2后面的后端应使用X-Forwarded-Authorization
头来检索整个JWT。后端必须验证此标头中的JWT,因为在未配置身份验证方法时,ESPv2不会执行验证
如果您只需要原始令牌中的声明,请参阅
ESP通常转发它收到的所有报头。但是,当后端地址由OpenAPI规范中的x-google-backend或gRPC服务配置中的BackendRule指定时,它将覆盖原始授权标头。ESP将在X-Endpoint-API-UserInfo
中向后端API发送身份验证结果。建议使用此标头而不是原始授权标头
因此,对于您的用例,请根据您需要的字段修改您的后端以读取
X-Forwarded-Authorization
或X-Endpoint-API-UserInfo
。如果您不想设置禁用身份验证
是,则不要读取授权
标题,这是正确的。请参阅我关于禁用此行为的回答。谢谢@nareddyt。但是如果我需要firebase auth来访问路径重定向请求的Google函数,该怎么办呢。在我的用例中,浏览器客户端对firebase用户进行身份验证,并希望通过API网关请求发送令牌。如果令牌无效或过期,api网关本身应该拒绝它。顺便说一句,目前,我正在从浏览器客户端发送令牌,作为POST请求正文的一部分,Google函数正在验证该令牌。如前所述,我认为正确使用GoogleAPI网关可以在该级别过滤此类身份验证。不是吗?我想你说的是两件不同的事。1) 如果要在云函数中编写代码以运行firebase auth,则需要在ESP中设置disable\u auth
,以便它不会更改令牌。2) 如果您希望ESP在不在云函数中编写任何代码的情况下进行身份验证,您也可以这样做。这就是ESP的预期用途。有关更多信息,请参阅本文档:再次感谢@nareddyt。我感兴趣的是后一种情况。因此,当浏览器将令牌发送到API网关时,它给出了我提出的上述错误。在我解决这个问题时,我的工作(通过谷歌功能进行身份验证)是临时性的。事实上,我从api yaml文件中删除了安全声明以便于实现这一点。感谢我澄清错误是由API网关引发的