Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Google Endpoints错误:Firebase ID令牌具有不正确的;澳元;(观众)要求。预期。。。但是得到_Firebase_Firebase Authentication_Google Cloud Functions_Google Cloud Endpoints_Google Cloud Endpoints V2 - Fatal编程技术网

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

我见过类似的问题,但我的用例似乎不同。让我解释一下

  • 我只有一个项目
  • 我正在项目中使用Firebase身份验证
  • 我已经创建了一个基于Node JS的http云函数,用于不同的路由
  • 我使用Postman向云功能发出POST请求,使用
    登录
    路由,传递电子邮件和密码,并在响应中获取令牌

    使用Postman,我向云函数发出POST请求,并通过传递先前请求中的令牌来使用
    检查
    路由,并对令牌进行身份验证。它起作用了。为此,我使用firebase admin客户端的
    admin.auth().verifyIdToken
    函数

    一切似乎都很好

    现在,当我在同一个项目中设置Google云端点(在Google云运行容器上)时,并且:

  • 我还没有在Firebase stagger yaml文件中设置任何证券期权(到目前为止)

  • 我可能会使用
    login
    path向谷歌云端点发送请求,我会像以前一样收到令牌

  • 但是,当我使用
    检查路径的端点发出POST请求时,我收到“Firebase ID令牌具有不正确的“aud”(观众)声明。”错误

  • 在这些论坛上,我似乎尝试了其他人提供的每一种选择。我已经从firebase控制台创建了一个私钥,并用它初始化了firebase管理客户端,但我得到了相同的错误,即“声明应该是项目Id,但它将其作为函数名”,这是同一项目的一部分

    我已经用cors(
    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网关引发的