简体   繁体   中英

Could not load the default credentials? (Node.js Google Compute Engine)

I am trying to create a new vm using Nodejs client libraries of GCP, I followed the below link, https://googleapis.dev/nodejs/compute/latest/VM.html#create

and below is my code

const Compute = require('@google-cloud/compute');
const {auth} = require('google-auth-library');
const compute = new Compute();

var cred = "<<<credential json content as string>>>";

auth.scopes = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/compute'];
auth.jsonContent = JSON.parse(cred);


const config = { 
    machineType: 'n1-standard-1', 
    disks: [ { 
        boot: true, 
        initializeParams: { sourceImage: '<<<image url>>>' } 
    } ], 
    networkInterfaces: [ { network: 'global/networks/default' } ], 
    tags: [ { items: [ 'debian-server', 'http-server' ] } ],
    auth: auth, 
};
async function main() {
    // [START gce_create_vm]
  
    async function createVM() {
      const zone = compute.zone('us-central1-c');
      const vm = zone.vm('vm-name');
      await vm.create(config).then(function(data) {
        const vm = data[0];
        const operation = data[1];
        const apiResponse = data[2];
      });

      console.log(vm);
      console.log('Virtual machine created!');
    }
    createVM().catch(function (err) {
        console.log(err);
   });
    // [END gce_create_vm]
}
  
main();

when i run this, the error I am getting is

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    at GoogleAuth.getApplicationDefaultAsync (D:\Click to deploy\src\c2dNodeGCP\node_modules\google-auth-library\build\src\auth\googleauth.js:155:19)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async GoogleAuth.getClient (D:\Click to deploy\src\c2dNodeGCP\node_modules\google-auth-library\build\src\auth\googleauth.js:487:17)
    at async GoogleAuth.authorizeRequest (D:\Click to deploy\src\c2dNodeGCP\node_modules\google-auth-library\build\src\auth\googleauth.js:528:24)

My scenario is to take the service account credential from string variable rather than from env var or some other thing.
I can see that it is trying to take the default credential which is not there in my case.
I was able to achieve this in java, but here i am not able to do it. Any help will be appreciated.

In order to execute your local application using your own user credentials for API access temporarily you can run:

gcloud auth application-default login
  • You have to install sdk into your computer, that will enable you to run the code.
  • Then log in to your associated gmail account and you will be ready.
  • You can check the following documentation , to get more information.

Another option is to set GOOGLE_APPLICATION_CREDENTIALS to provide authentication credentials to your application code. It should point to a file that defines the credentials.

To get this file please follow the steps:

  1. Navigate to the APIs & Services→Credentials panel in Cloud Console.
  2. Select Create credentials , then select API key from the dropdown menu.
  3. The API key created dialog box displays your newly created key.
  4. You might want to copy your key and keep it secure. Unless you are using a testing key that you intend to delete later.
  5. Put the *.json file you just downloaded in a directory of your choosing.
  6. This directory must be private (you can't let anyone get access to this), but accessible to your web server code. You can write your own code to pass the service account key to the client library or set the environment variable GOOGLE_APPLICATION_CREDENTIALS to the path of the JSON file downloaded.

I have found the following code that explains how you can authenticate to Google Cloud Platform APIs using the Google Cloud Client Libraries.

/**
 * Demonstrates how to authenticate to Google Cloud Platform APIs using the
 * Google Cloud Client Libraries.
 */

'use strict';

const authCloudImplicit = async () => {
  // [START auth_cloud_implicit]
  // Imports the Google Cloud client library.
  const {Storage} = require('@google-cloud/storage');

  // Instantiates a client. If you don't specify credentials when constructing
  // the client, the client library will look for credentials in the
  // environment.
  const storage = new Storage();
  // Makes an authenticated API request.
  async function listBuckets() {
    try {
      const results = await storage.getBuckets();

      const [buckets] = results;

      console.log('Buckets:');
      buckets.forEach((bucket) => {
        console.log(bucket.name);
      });
    } catch (err) {
      console.error('ERROR:', err);
    }
  }
  listBuckets();
  // [END auth_cloud_implicit]
};

const authCloudExplicit = async ({projectId, keyFilename}) => {
  // [START auth_cloud_explicit]
  // Imports the Google Cloud client library.
  const {Storage} = require('@google-cloud/storage');

  // Instantiates a client. Explicitly use service account credentials by
  // specifying the private key file. All clients in google-cloud-node have this
  // helper, see https://github.com/GoogleCloudPlatform/google-cloud-node/blob/master/docs/authentication.md
  // const projectId = 'project-id'
  // const keyFilename = '/path/to/keyfile.json'
  const storage = new Storage({projectId, keyFilename});

  // Makes an authenticated API request.
  async function listBuckets() {
    try {
      const [buckets] = await storage.getBuckets();

      console.log('Buckets:');
      buckets.forEach((bucket) => {
        console.log(bucket.name);
      });
    } catch (err) {
      console.error('ERROR:', err);
    }
  }
  listBuckets();
  // [END auth_cloud_explicit]
};

const cli = require(`yargs`)
  .demand(1)
  .command(
    `auth-cloud-implicit`,
    `Loads credentials implicitly.`,
    {},
    authCloudImplicit
  )
  .command(
    `auth-cloud-explicit`,
    `Loads credentials explicitly.`,
    {
      projectId: {
        alias: 'p',
        default: process.env.GOOGLE_CLOUD_PROJECT,
      },
      keyFilename: {
        alias: 'k',
        default: process.env.GOOGLE_APPLICATION_CREDENTIALS,
      },
    },
    authCloudExplicit
  )
  .example(`node $0 implicit`, `Loads credentials implicitly.`)
  .example(`node $0 explicit`, `Loads credentials explicitly.`)
  .wrap(120)
  .recommendCommands()
  .epilogue(
    `For more information, see https://cloud.google.com/docs/authentication`
  )
  .help()
  .strict();

if (module === require.main) {
  cli.parse(process.argv.slice(2));
}

You could obtain more information about this in this link , also you can take a look at this other guide for Getting started with authentication .

Edit 1

To load your credentials from a local file you can use something like:

const Compute = require('@google-cloud/compute');
const compute = new Compute({
  projectId: 'your-project-id',
  keyFilename: '/path/to/keyfile.json'
});

You can check this link for more examples and information. This other link contains another example that could be useful.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM