Google表格API v4,如何从Node.js(Docker容器)进行身份验证

时间:2018-01-27 05:08:03

标签: node.js docker docker-compose google-oauth google-sheets-api

我正在学习如何使用Google表格API v.4从工作表中下载数据 - >我的nodeJS服务器。我在我的节点应用程序中使用Docker容器。在本地主机上或在Docker中的服务器上联机失败。它可以在localhost上正常工作,但不能在Docker容器中工作。我已将Google API控制台上的IP地址列入白名单。 (注意:我可以轻松地从此节点服务器使用firebase API,而不是Google表格v4 API)

参考:https://developers.google.com/sheets/api/quickstart/nodejs#step_4_run_the_sample

首次运行应用程序时,节点服务器上的命令行显示:

Authorize this app by visiting this url:  
https://accounts.google.com/o/oauth2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets.readonly&response_type=code&client_id=xxx.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob

您转到该网址,该Google页面会显示:

Sign in
Please copy this code, switch to your application and paste it there.
4/xxxxxxxxxxxx

这就是问题所在。这没办法。我可以将4/xxx令牌复制并粘贴到命令行中,但它失败了。没有错误消息,没有任何消息。也没有功能。有没有办法从这里到达那里?我知道这在台式计算机上的独立节点服务器上工作正常,但不在docker容器(localhost或online)中。是否有手动方法进行身份验证?

-----------编辑----------------------------------- ----------------------

我再次开始查看代码,问题是在使用docker容器时节点readline失败。

var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

这个问题已经存在于StackOveflow上。

Unable to get standard input inside docker container

副本:

how to get docker container to read from stdin?

  

您需要使用--interactive以交互模式运行容器   或-i:

哇......你是如何在docker-compose部署中做到的?

Interactive shell using Docker Compose

哎哟。没有继续发布。我没有为我工作..请参阅下面提供的答案......

此处提供的信息,以防其他任何人在路上遇到这种情况。

1 个答案:

答案 0 :(得分:1)

事实证明,解决方案远不及Interactive shell using Docker Compose

提供的解决方案

我在docker容器中运行节点服务器。我想使用终端在容器启动时插入一个令牌,以响应Google Sheet API调用,使用Node readline方法。

相反,我提出的解决方案是我在docker compose github issue.中看到的一个注释的结果。长时间阅读docker compose函数让我找到了更好的解决方案。它很简单:

private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
    try {
        GoogleSignInAccount account = completedTask.getResult(ApiException.class);
        // Signed in successfully, show authenticated UI.
        updateUI(account);
        idToken = account.getIdToken();
        finish();
    } catch (ApiException e) {
        // The ApiException status code indicates the detailed failure reason.
        // Please refer to the GoogleSignInStatusCodes class reference for more information.
        Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
        updateUI(null);
    }
}

这里有一个重要问题......单词$ docker-compose build $ docker-compose run -p 8080:80 node 是我在下面的docker-compose.yml文件中调用的服务名称。此解决方案在我的localhost和通过SSH终端的在线服务器上运行良好。

Dockerfile:

node

搬运工-compose.yml

FROM node:8
RUN mkdir -p /opt/app
# set our node environment, either development or production
ARG NODE_ENV=production
ENV NODE_ENV $NODE_ENV
# default to port 80 for node, and 5858 or 9229 for debug
ARG PORT=80
ENV PORT $PORT
EXPOSE $PORT 5858 9229
# install dependencies first, in a different location for easier app bind mounting for local development
WORKDIR /opt
COPY package.json package-lock.json* ./
RUN npm install && npm cache clean --force
ENV PATH /opt/node_modules/.bin:$PATH
# copy in our source code last, as it changes the most
WORKDIR /opt/app
COPY . /opt/app
CMD [ "node", "./bin/www" ]

非常感谢Bret Fisher在node docker defaults.

上的工作