Upload without authentication by using a signed URL to manually start resumable uploads

Example in Node.js: https://github.com/googleapis/nodejs-storage/pull/1711

Code sample


For more information, see the Cloud Storage Node.js API reference documentation.

 * TODO(developer): Uncomment the following lines before running the sample.
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The contents that you want to upload
// const contents = 'these are my contents';

// The new ID for your GCS file
// const destFileName = 'your-new-file-name';

// Imports the Google Cloud Node.js client library
const {Storage} = require('@google-cloud/storage');

const fetch = require('node-fetch');

// Creates a client
const storage = new Storage();

async function uploadWithoutAuthenticationSignedUrlStrategy() {
  const file = storage.bucket(bucketName).file(destFileName);

  // Use signed URLs to manually start resumable uploads.
  // Authenticating is required to get the signed URL, but isn't
  // required to start the resumable upload
  const options = {
    version: 'v4',
    action: 'resumable',
    expires: Date.now() + 30 * 60 * 1000, // 30 mins
  //auth required
  const [signedUrl] = await file.getSignedUrl(options);

  // no auth required
  const resumableSession = await fetch(signedUrl, {
    method: 'POST',
    headers: {
      'x-goog-resumable': 'start',

  // Endpoint to which we should upload the file
  const location = resumableSession.headers.location;

  // Passes the location to file.save so you don't need to
  // authenticate this call
  await file.save(contents, {
    uri: location,
    resumable: true,
    validation: false,

  console.log(`${destFileName} uploaded to ${bucketName}`);


What's next

To search and filter code samples for other Google Cloud products, see the Google Cloud sample browser.