如何在node.js中使用OAuth2

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

我想使用@ google-cloud客户端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(`[email protected]`);

        //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
}
google-bigquery
1个回答
0
投票

您共享的JSON对象不是OAuth令牌,它看起来像来自@ google-auth-library的OAuth2Client对象。

实际的OAuth令牌只是一个字符串,如“ya29.ABC123ABC123_cG123ABCDETCETCETC”。

该“令牌”实际上是OAuth2Client,然后您可以使用getAccessToken方法获取令牌。如果它只是一个普通的JSON对象,那么你可以获得credentials.access_token字段,它是实际的访问令牌。

请注意,访问令牌过期。 getAccessToken将在必要时获得一个新的,但只是从对象获取access_token不会,并且可能在它到期后导致403s。

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