0

我一直在尝试用节点调用jobs.Insert bigquery rest api端点(jobs.Insert方法似乎没有在bigquery节点库中公开)。

我已经设置了服务到服务的东西,以便我可以成功调用 bigquery 节点库具有的方法(创建包含私钥等的 json 文件以进行服务到服务调用) .

据我所知,我应该能够直接使用签名的 jwt 作为承载令牌调用其余 api,而无需经过两步 OAuth 过程。

我有东西可以签署 jwt,但仍然遇到身份验证错误,试图通过 curl (作为第一步)调用原始 api,例如

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

(“请求具有无效的身份验证凭据。应为 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。”

有没有人有这样做的例子?可能缺少一个简单的事情,一个工作示例会很明显。

谢谢

4

2 回答 2

1

您可以使用这个工作示例

  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"
于 2019-03-24T17:32:51.887 回答
0

好的-关于我最初的问题的技巧与获取用于 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 是您在 Google Cloud Platform APIs & Services 页面中生成“服务帐户密钥”/凭据时获得的 json 文件中的 json 对象。

生成的 access_token 可用于进行如下调用 - 这很有效 - 我使用了上面函数中的 access_token,并从 jsonObjectFromGoogleKeyEtcFile 的 project_id 属性中获取了 projectId:

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

有趣的是,你也会得到一个 refresh_token,但它的值是“jwt-placeholder”

唷。

于 2019-03-24T23:41:17.210 回答