如何从托管在 Docker 容器中的 NodeJS 服务器调用 google-cloud/local-auth?

问题描述 投票:0回答:1

我有一个 NodeJS 服务器,我计划部署它,所以我对它进行了 docker 化以使该过程更容易。我现在遇到一个问题,每次我尝试验证或获取用户的谷歌帐户刷新令牌时,它都不会运行。我认为这是因为它位于一个 docker 容器中,该容器是一个独立的进程,无法在 Chrome 中打开选项卡以允许访问我的服务器以获取令牌。但这让我想到一个问题,如果 NodeJS 服务器无法从纯粹的服务器端角度进行身份验证,为什么还要有一个库来访问谷歌云呢?我可能在这里遗漏了一些东西,但我一直在努力解决这个问题。

async function authorize() {
    let client = await loadSavedCredentialsIfExist();
    if (client) {
        return client;
    }
    client = await authenticate({
        scopes: SCOPES,
        keyfilePath: CREDENTIALS_PATH,
    });
    if (client.credentials) {
        await saveCredentials(client);
    }
    return client;
}

这是我的授权函数,我将使用它来获取所有必要的凭据,以便为任何给定用户调用 GmailAPI。我需要从中获取的主要内容是刷新令牌。目前,这又是在本地运行的 docker 容器中。

更多上下文,这是我进行 docker 化之前的流程:用户将拥有 chrome 扩展,然后单击它时,它会弹出 Google OAuth2.0 提示,让我们可以访问他们的令牌。然后,我们可以使用它来为我们拥有的任何给定用户调用 Gmail API。我们只是修改电子邮件/为其添加标签,以便更好地使用。

我以为我可以在客户端调用(这是一个 chrome 扩展)来获取刷新令牌,但遇到了无数的 CORS 错误。我也不想暴露我的 Google Cloud 的 ClientID。我想也许我们可以从客户端获取令牌,并将其传递到服务器并以这种方式获取刷新令牌,但似乎没有任何效果。我也不想在客户端处理用户刷新令牌,因为这对我来说似乎有点冒险 - 但任何建议都会很棒。谢谢你

node.js docker google-cloud-platform google-chrome-extension gmail-api
1个回答
0
投票

好吧,几个小时后,我希望这对某些人来说是有意义的。基本上我在网上找到的所有内容都告诉我使用服务帐户来完成此操作,但是当您查看这些用例时,它与我实际需要完成的事情相反。在我的客户端(chrome 扩展)上,我能够通过授权过程运行用户,然后将该临时令牌传递到后端,在后端再进行几次调用来查找刷新令牌。

google-cloud/local-auth
正常运行真正需要的就是该令牌,因为其余的事情总是相同的并且可以由我处理。奇怪的是,我发现的解决方案是最近发布的,但浏览量很少,所以需要一些挖掘!现在感觉自己还蛮幸运的。谢谢大家,希望这可以帮助其他人在未来。这始终是一个学习过程!

这是媒体文章的链接,我希望它有更多的吸引力,因为它是我发现的唯一一篇以清晰简洁的方式实际包含有用信息的文章。

https://medium.com/@tony.infisical/guide-to-using-oauth-2-0-to-access-google-apis-dead94d6866d

© www.soinside.com 2019 - 2024. All rights reserved.