Пример рабочего узла вызова google api с jwt для вызова между сервисами к необработанной конечной точке? - PullRequest
0 голосов
/ 23 марта 2019

Я пытался вызвать вызов jobs. Вставить конечную точку api bigquery rest с узлом (метод jobs.Insert, по-видимому, не представлен в библиотеке узлов bigquery).

У меня настроен компонент Service-to-Service, так что я могу успешно вызывать методы, которые есть в библиотеке узла bigquery (создать файл json с закрытым ключом и т. Д. Для сервис-к-серверу). сервисные звонки).

Насколько я могу судить, я должен иметь возможность вызывать остальные api напрямую с подписанным jwt в качестве токена-носителя без необходимости проходить двухэтапный процесс OAuth.

У меня есть материал для подписи jwt, но я все еще получаю ошибки аутентификации, пытаясь вызвать raw api только с помощью curl (в качестве первого шага) через что-то вроде

curl -H "Authorization: Bearer my_signed_jwt" https://www.googleapis.com/bigquery/v2/projects/my_project_id/datasets

(«В запросе были неверные учетные данные для аутентификации. Ожидаемый токен доступа OAuth 2, файл cookie для входа в систему или другие действительные учетные данные для аутентификации.»

У кого-нибудь есть пример сделать это? Может быть, не хватает только простой вещи, которую рабочий пример сделает очевидным.

спасибо

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Вы можете использовать этот рабочий пример, который делает

  1. Инициация query Объект
  2. Инициация oAuth2 Объект
  3. Звоните bigQuery.Jobs.insert

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

import {google} from 'googleapis'

let bigQuery = google.bigquery("v2")

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

    it('Test query', async () => {
        let result = await test('panada')

    })

    async function test(p1) {
        try {
            let query = `SELECT url FROM \`publicdata.samples.github_nested\`
                WHERE repository.owner = 'panada'`

            let auth = getBasicAuthObj()
            auth.setCredentials({
                access_token: "myAccessToken",
                refresh_token: "myRefreshToken"
            })

            let request = {
                "projectId": "myProject",
                auth,
                "resource": {
                    "projectId": "myProject",
                    "configuration": {
                        "query": {
                            query,
                            "useLegacySql": false
                        },
                        "dryRun": false
                    }
                }
            }

            console.log(`query is: ${query}`)

            let result = await callBQ(request) //Check JOB status to make sure it's done
            console.log(`result is: ${JSON.stringify(result.data)}`)

            result.forEach((row, index) => {
                console.log(`row number ${index}, url is: ${row.url}`)
            })
        } catch (err) {
            console.log("err", err)
        }
    }

    /**
     * Call BigQuery jobs.insert
     * @param request
     * @returns {Promise}
     */
    async function callBQ(request) {
        debugger
        console.log("request", request)
        try {
            let result = await bigQuery.jobs.insert(request, request)//, (err, results) => {
            console.log(`All good.....`)

            return result
        } catch (e) {
            console.log(`Failed to run query: ${e}`)
        }

    }


    /**
     * Create oAuth object
     * @returns {OAuth2Client}
     */
    function getBasicAuthObj() {
        let clientId = 'myClientId'
        let clientSecret = 'mySecret'
        let redirectUrl = 'url'

        return new google.auth.OAuth2(
            clientId,
            clientSecret,
            redirectUrl
        )
    }
})

примечание: вам нужно добавить эту строку в package.json

"googleapis": "34.0.0"
0 голосов
/ 25 марта 2019

хорошо - уловка с моим первоначальным вопросом была связана с получением токена доступа для использования в вызове API.

const { JWT } = require('google-auth-library');
function getJWTResultWithAccessAndRefreshToken(jsonObjectFromGoogleKeyEtcFile,
                                                callbackWithErrAndResult) {

var scopes = [
              "https://www.googleapis.com/auth/bigquery",
              "https://www.googleapis.com/auth/cloud-platform",
              "https://www.googleapis.com/auth/devstorage.full_control",
              "https://www.googleapis.com/auth/devstorage.read_only",
              "https://www.googleapis.com/auth/devstorage.read_write"
            ];

var jwt = new JWT(
    jsonObjectFromGoogleKeyEtcFile.client_email,
    null,
    jsonObjectFromGoogleKeyEtcFile.private_key,
    scopes);

jwt.authorize(function (err, result) {
    callbackWithErrAndResult(err, result.access_token, result.refresh_token);
});

}

Здесь jsonObjectFromGoogleKeyEtcFile - это объект json из файла json, который вы получаете при создании «Ключей учетной записи службы» / учетных данных на странице API и служб облачной платформы Google.

Сгенерированный access_token может быть использован для вызова, как показано ниже, - который работал - где я использовал access_token из функции выше и получил идентификатор проекта из свойства project_id jsonObjectFromGoogleKeyEtcFile:

curl -H "Authorization: Bearer generated_via_jwt_access_token" \                    
          https://www.googleapis.com/bigquery/v2/projects/projectId/datasets

Интересно, что вы тоже получаете refresh_token, но он имеет значение "jwt-placeholder"

Уф.

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