Skip to content

Commit

Permalink
samples: add v4 signed policy sample (#1116)
Browse files Browse the repository at this point in the history
* add v4 signed policy sample

* fix comments

* nit: v4 signed policy

* use updated method name

* add test

* fixy

* fixy

* fix assert

* copy: file to create

* use string concat instead of console.log each line

* const => let

* fix

Co-authored-by: Jonathan Lui <jonathanlui@google.com>
  • Loading branch information
frankyn and jkwlui committed Mar 30, 2020
1 parent 13114fd commit d119ace
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
69 changes: 69 additions & 0 deletions samples/generateV4SignedPolicy.js
@@ -0,0 +1,69 @@
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
* This application demonstrates how to perform basic operations on files with
* the Google Cloud Storage API.
*
* For more information, see the README.md under /storage and the documentation
* at https://cloud.google.com/storage/docs.
*/

function main(bucketName = 'my-bucket', filename = 'test.txt') {
// [START storage_generate_post_policy_url_v4]
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const filename = 'File to access, e.g. file.txt';

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

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

async function generateV4SignedPolicy() {
const bucket = storage.bucket(bucketName);
const file = bucket.file(filename);

// These options will allow temporary uploading of a file
// through an HTML form.
const expires = Date.now() + 10 * 60 * 1000; // 10 minutes
const options = {
expires,
fields: {'x-goog-meta-test': 'data'},
};

// Get a v4 signed policy for uploading file
const [response] = await file.generateSignedPostPolicyV4(options);

// Create an HTML form with the provided policy
let output = `<form action='${response.url}' method='POST' enctype="multipart/form-data">\n`;
// Include all fields returned in the HTML form as they're required
for (const name of Object.keys(response.fields)) {
const value = response.fields[name];
output += ` <input name='${name}' value='${value}' type='hidden'/>\n`;
}
output += " <input type='file' name='file'/>\n";
output += " <input type='submit' value='Upload File' name='submit'/>\n";
output += '</form>';

console.log(output);
}

generateV4SignedPolicy().catch(console.error);
// [END storage_generate_post_policy_url_v4]
}
main(...process.argv.slice(2));
22 changes: 22 additions & 0 deletions samples/system-test/files.test.js
Expand Up @@ -240,6 +240,28 @@ it('should generate a v4 signed URL and upload a file', async () => {
});
});

it('should generate a v4 signed policy', async () => {
const output = execSync(
`node generateV4SignedPolicy.js ${bucketName} ${signedFileName}`
);

assert.include(
output,
`<form action='https://storage.googleapis.com/${bucketName}/`
);
assert.include(output, `<input name='key' value='${signedFileName}'`);
assert.include(output, "<input name='x-goog-signature'");
assert.include(output, "<input name='x-goog-date'");
assert.include(output, "<input name='x-goog-credential'");
assert.include(
output,
"<input name='x-goog-algorithm' value='GOOG4-RSA-SHA256'"
);
assert.include(output, "<input name='policy'");
assert.include(output, "<input name='x-goog-meta-test' value='data'");
assert.include(output, "<input type='file' name='file'/>");
});

it('should get metadata for a file', () => {
const output = execSync(
`node getMetadata.js ${bucketName} ${copiedFileName}`
Expand Down

0 comments on commit d119ace

Please sign in to comment.