当前位置: 首页 > 知识库问答 >
问题:

当使用为另一个服务返回的JWT时,云运行服务请求总是以401失败。同样的请求与为最终用户返回的JWT一起工作

鲁浩渺
2023-03-14

我有一个由多个云运行服务组成的应用程序。每个服务只对一组特定的其他服务开放。

export const getToken = async (url: string, targetAUD?: string) => {
    const auth = new GoogleAuth();
    const request  = async () => {
        if (!targetAUD) {
            targetAUD = new URL(url).origin;
        }
        console.info(`request ${url} with target audience ${targetAUD}`);
        const client = await auth.getIdTokenClient(targetAUD);
        const res = await client.request({url});
        console.info(res.data);
        return res.data;
    }
    try {
       return await request();
    } catch (err) {
        console.error(err);
    }
}

当以getToken('http://data-provider-service-123.run.app');的形式调用上面的函数时,请求失败,401未授权。我还尝试将其称为getToken('https://data-provider-service-123.run.app');,并得到一个403禁止的响应。以下条目将为每个此类请求添加到data-provider-servicehtml" target="_blank">日志中

    {
    httpRequest: {9}insertId: "60fcb7e0000c12346fe37579"
    logName: "projects/my-project/logs/run.googleapis.com%2Frequests"
    receiveTimestamp: "2021-07-25T01:01:20.806589957Z"
    resource: {2}
    severity: "WARNING"
    textPayload: "The request was not authorized to invoke this service. Read more at 
     https://cloud.google.com/run/docs/securing/authenticating"
    timestamp: "2021-07-25T01:01:20.800918Z"
    trace: "projects/my-project/traces/25b3c13890aad01234829711d4e9f25"
    }

我还尝试通过运行curl“http://metadata.google.internal/computemetadata/v1/instance/service-accounts/default/identity?audience=http://data-provider-servive-123.run.app”\-h“metadata-flavel:google”从compute metadata server(也是文档中宣传的一种方式)获取和使用JWT。

当我在Cloud Shell中执行这段代码时,我得到了如下所示的JWT

{
"iss": "accounts.google.com",
"azp": "123456789-9r9s1c4alg36erliucho9t52n12n6abc.apps.googleusercontent.com",
"aud": "123456789-9r9s1c4alg36erliucho9t52n12n6abc.apps.googleusercontent.com",
"sub": "106907196154567890477",
"email": "my_email@gmail.com",
"email_verified": true,
"at_hash": "dQpctkQE2Sy1as1qv_w",
"iat": 1627173901,
"exp": 1627177501,
"jti": "448d660269d4c7816ae3zd45wrt89sb9f166452dce"
}

然后,我使用postman向https://data-provider-service/get-data发出请求,标题为授权:“bearer ,一切正常

但是,如果我从我的api-service发出同样的请求,返回的JWT是

{
"aud": "http://data-provider-service-123.run.app",
"azp": "111866132465987679716",
"email": "api-service-account@domain",
"email_verified": true,
"exp": 1627179383,
"iat": 1627175783,
"iss": "https://accounts.google.com",
"sub": "111866132465987679716"
}

如果我向邮递员发出相同的请求,并将此JWT放入授权头中,则返回401 Unauthorized。

共有1个答案

卞博简
2023-03-14

在请求computing metadata server时,我将目标服务URL中的http更改为https,看起来解决了问题。使用google-auth-library请求像这样的令牌仍然失败,出现403错误。

如果解决方案是可持续的,我会更新答案。

 类似资料:
  • 问题内容: 我有这个应用程序,它可以在本地运行,并且在部署时可以使用.mdf SQL Express数据库文件(通常用于测试目的)。但是,当我将其更改为可与我们的SQL Server 2008一起使用时,该应用程序可以运行,但该服务无法运行。 例如,如果在页面后面的代码中,我有一个按钮可以向表中添加数据,例如: 我的web.config设置为在该服务器上使用模拟,并且一切运行良好。但是,对于我的服

  • 问题内容: 我正在尝试通过COM端口发送AT命令,但只重新发送了相同的命令。 日志: 16:19:21.910 [main]调试SerialConnections.M234Serial-创建实例。 16:19:21.974 [main]调试SerialConnections.M234Serial-发送请求:AT ^ SCFG? 16:19:23.976 [EventThread COM55]调试S

  • 我正在尝试从www.mysite上的ASPX页面向web服务发出请求。com使用jQuery。 我的Web服务托管在https://www.mysite2.com. 我已尝试以这种方式执行请求(我在网上找到了部分代码): 我遇到两个问题: 1)IE返回拒绝访问错误(代码0x80070005) 2) Chrome返回“不安全响应”错误 返回的JSON将用于填充自动完成源。 有什么解决这个问题的建议吗

  • 我使用RESTAssured练习web服务。在post请求中,它返回500服务器错误,其中我使用邮差发送请求,没有错误。谁能帮我调试一下这个错误吗?请给点意见。任何帮助都是感激的?提前道谢。 错误消息的状态代码应为<200>,但为<500>。 堆栈跟踪:

  • 我想使用cli复制此Spring初始化设置。 然而,每当我尝试将“rest”添加为依赖项时,该命令就会返回以下错误消息,即rest存储库在rest之上公开Spring数据存储库。 下面是我正在运行的命令: 如果rest不是正确的依赖项名称,那么是什么?此外,如何从命令行列出可用的依赖项以获得正确的名称。

  • 我制作了一个具有三个路径参数的POST web服务。 但当我尝试通过url请求此web服务时,我得到HTTP状态405-不允许使用该方法 但是同样的方法有效,如果我将Web服务更改为@GET 请求URL: 这是我得到的回应 任何帮助将不胜感激!