Как использовать OAuth2 с node.js - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы использовать @ google-cloud client lib для вставки данных в BigQuery.
Поскольку у меня несколько клиентов, и у каждого из них разная роль IAM, я не могу использовать служебную учетную запись, подобную этой:

const bigquery = new BigQuery({
                projectId: `myProject`,
                keyFilename: '/Users/services/ssh/myProject-111.json'
            });

Скорее, я хотел бы использовать oauth2 для конкретного клиента, например:

const bigquery = new BigQuery({
                projectId: `mydata-1470162410749`,
                token: clientOauth2Token
            });

Я получаю эту ошибку

Ошибка в процессе: запрос имеет неверные учетные данные аутентификации.Ожидаемый токен доступа OAuth 2, файл cookie для входа или другие действительные учетные данные для аутентификации.См. https://developers.google.com/identity/sign-in/web/devconsole-project. - Неверные учетные данные

Это полный код теста мокко, который я использую:

import BigQuery from '@google-cloud/bigquery';
import {GoogApi} from "../apiManager" //Private code to get Token from client DB

if (!global._babelPolyfill) {
    var a = require("babel-polyfill")
}

describe('Check routing', async () => {

    it('Test stack  ', async (done) => {

        //Fetch client Auth from local Database
        let apiManager = new GoogApi({query: {integrationTest: 'on'}}, {}, (err, httpResults) => {});
        let clientAuth = await apiManager.getGoogleTokensByUserId(`user@company.con`);

        //Replace the 2 value below with real values
        const tableName = "myTest";
        const dataset = "EVALUEX_DEV";

        try {
            const bigquery = new BigQuery({
                projectId: `myProject`,
                token: clientAuth.credentials.access_token
            });
            await bigquery.createDataset(dataset)
                .then(
                    args => {
                        console.log(`Create dataset, result is: ${args}`)
                    })
                .catch(err => {
                    console.log(`Error in the process: ${err.message}`)
                })
        } catch (err) {
            console.log("err", err)
        }
    })
})

Так выглядит мой токен при проверкеэто

{
  "domain": null,
  "_events": {},
  "_eventsCount": 0,
  "transporter": {},
  "credentials": {
    "access_token": "My Token",
    "refresh_token": "my Refresh Token"
  },
  "certificateExpiry": null,
  "refreshTokenPromises": [],
  "_clientId": "my Client Id",
  "_clientSecret": "My client secret",
  "redirectUri": "https://s1dg0yjhih.execute-api.us-east-1.amazonaws.com/stage1/goog/saveToken",
  "eagerRefreshThresholdMillis": 300000
}

1 Ответ

0 голосов
/ 23 февраля 2019

JSON-объект, которым вы поделились, не является токеном OAuth, он выглядит как объект OAuth2Client из @ google-auth-library.

Фактический токен OAuth - это просто строка, например "ya29.ABC123ABC123_cG123ABCDETCETCETC".

Этот «токен» на самом деле является OAuth2Client, тогда вы можете получить токен с помощью метода getAccessToken.Если это просто обычный объект JSON, то вы можете получить поле credentials.access_token, являющееся фактическим токеном доступа.

Обратите внимание, что маркеры доступа устарели.getAccessToken при необходимости получит новый, но простое получение access_token от объекта не даст, и может закончиться через 403 с после его истечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...