diff --git a/common/scripts/prep-samples.js b/common/scripts/prep-samples.js index b55fd5e9fff3..6c521c039c29 100644 --- a/common/scripts/prep-samples.js +++ b/common/scripts/prep-samples.js @@ -23,13 +23,15 @@ const baseFS = require("fs"); const path = require("path"); +const promisify = require("util").promisify; + +const exec = promisify(require("child_process").execFile); // Node >= 10 provide fs.promises, but since we're still building Node 8 for now // we need to use util.promisify if fs.promises doesn't exist const fs = baseFS.promises || (() => { - const promisify = require("util").promisify; return { readdir: promisify(baseFS.readdir), readFile: promisify(baseFS.readFile), @@ -154,6 +156,33 @@ async function main() { `${package.name}@${package.version}` ); + // Check if the package samples directory is dirty using git + // Refuse to proceed if this script may overwrite changes to samples. + try { + const gitDiff = await exec("git", [ + "status", + "-s", + path.join(baseDir, "samples") + ]); + if (gitDiff.stdout !== "") { + console.error( + "[prep-samples] Error: The samples tree is dirty. Refusing to continue." + ); + console.error( + "[prep-samples] Stash or commit your changes to the following files:" + ); + for (const line of gitDiff.stdout.trim().split("\n")) { + console.error(" -", line); + } + process.exit(1); + } + } catch (err) { + console.error( + "[prep-samples] Error: Failed to check the git status. Refusing to continue." + ); + process.exit(1); + } + const tsDir = path.join(baseDir, "samples", "typescript", "src"); for await (const fileName of findMatchingFiles( tsDir, @@ -175,6 +204,6 @@ async function main() { } main().catch(err => { - console.error("[prep-samples] Error:", err); + console.error("[prep-samples]", err); process.exit(1); }); diff --git a/sdk/keyvault/keyvault-certificates/package.json b/sdk/keyvault/keyvault-certificates/package.json index d3f21fbfb6f6..6eacaa77a3fb 100644 --- a/sdk/keyvault/keyvault-certificates/package.json +++ b/sdk/keyvault/keyvault-certificates/package.json @@ -41,14 +41,16 @@ "scripts": { "audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit", "build:minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js 2>&1", - "build:samples": "tsc -p tsconfig.samples.json", + "build:samples": "node ../../../common/scripts/prep-samples.js && cd samples && tsc", "build:es6": "tsc -p tsconfig.json", "build:nodebrowser": "rollup -c 2>&1", "build:test": "npm run build:es6 && rollup -c rollup.test.config.js 2>&1", - "build": "npm run extract-api && npm run build:samples && npm run build:es6 && npm run build:nodebrowser", + "build": "npm run extract-api && npm run build:es6 && npm run build:nodebrowser", "check-format": "prettier --list-different --config ../../.prettierrc.json \"src/**/*.ts\" \"*.{js,json}\"", - "clean": "rimraf dist-esm dist-test typings *.tgz *.log", - "execute:samples": "echo skipped", + "clean": "rimraf dist-esm dist-test typings *.tgz *.log samples/typescript/dist", + "execute:js-samples": "node ../../../common/scripts/run-samples.js samples/javascript/", + "execute:ts-samples": "node ../../../common/scripts/run-samples.js samples/typescript/dist/samples/typescript/src/", + "execute:samples": "npm run build:samples && npm run execute:js-samples && npm run execute:ts-samples", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"samples/*.ts\" \"*.{js,json}\"", "integration-test:browser": "karma start --single-run", diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/README.md b/sdk/keyvault/keyvault-certificates/samples/javascript/README.md new file mode 100644 index 000000000000..3d763abc6b35 --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/README.md @@ -0,0 +1,80 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure + - azure-key-vault +urlFragment: keyvault-certificates-javascript +--- + +# Azure Key Vault Certificates client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Key Vault Certificates in some common scenarios. + +| **File Name** | **Description** | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [backupAndRestore.js][backupandrestore] | creates a self-signed certificate, then makes a backup from it, then deletes it and purges it, and finally restores it | +| [contacts.js][contacts] | creates, updates and deletes certificate contacts | +| [deleteAndRecover.js][deleteandrecover] | creates a self-signed certificate, then deletes it, then recovers it (soft-delete is required for this sample to run, see: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete) | +| [helloWorld.js][helloworld] | creates a self-signed certificate, reads it in various ways, updates the tags of the certificate and finally deletes the certificate | +| [issuers.js][issuers] | creates, updates and deletes certificate issuers | +| [listCertificates.js][listcertificates] | lists previously created certificates in a single chunk and by page, then changes one of them and lists all the versions of that certificate, then deletes them and lists the deleted certificates. | +| [mergeCertificate.js][mergecertificate] | creates a certificate with an Unknown issuer, then signs this certificate using a fake certificate authority and the mergeCertificate API method | +| [operations.js][operations] | creates, updates and deletes a certificate's operation | + +## Prerequisites + +The samples are compatible with Node.js >= 8.0.0. + +You need [an Azure subscription][freesub] and [an Azure Key Vault][azkeyvault] to run these sample programs. To quickly create the needed Key Vault resources in Azure and to receive a connection string for them, you can deploy our sample template by clicking: + +[![](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-sdk-for-js%2Fmaster%2Fsdk%2Fkeyvault%2Fkeyvault-certificates%2Ftests-resources.json) + +If creating the Key Vault manually using the Azure Portal, be aware that the samples require that the soft-delete feature be enabled. Our template above will enable this feature automatically, but it is possible to enable it manually using the Azure CLI. See [this page][kvsoftdelete] for more information. + +Samples retrieve credentials to access the Key Vault from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node helloWorld.js +``` + +Alternatively, run a single sample with the correct environment variables set (step 2 is not required if you do this), for example (cross-platform): + +```bash +npx cross-env KEYVAULT_NAME="" AZURE_TENANT_ID="" AZURE_CLIENT_ID="" AZURE_CLIENT_SECRET="" node helloWorld.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[backupandrestore]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/backupAndRestore.js +[contacts]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/contacts.js +[deleteandrecover]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/deleteAndRecover.js +[helloworld]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/helloWorld.js +[issuers]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/issuers.js +[listcertificates]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/listCertificates.js +[mergecertificate]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/mergeCertificate.js +[operations]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/javascript/operations.js +[apiref]: https://docs.microsoft.com/javascript/api/@azure/keyvault-certificates +[azkeyvault]: https://docs.microsoft.com/azure/key-vault/quick-create-portal +[kvsoftdelete]: https://docs.microsoft.com/azure/key-vault/key-vault-soft-delete-cli +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/README.md diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/backupAndRestore.js b/sdk/keyvault/keyvault-certificates/samples/javascript/backupAndRestore.js index 58a78dc90f65..b1c67dccfa27 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/backupAndRestore.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/backupAndRestore.js @@ -1,6 +1,12 @@ -const { CertificateClient } = require("../../dist"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample creates a self-signed certificate, then makes a backup from it, // then deletes it and purges it, and finally restores it. @@ -20,7 +26,7 @@ async function main() { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate123129"; + const certificateName = "MyCertificateBackupAndRestoreJS"; // Creating a self-signed certificate const createPoller = await client.beginCreateCertificate(certificateName, { diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/contacts.js b/sdk/keyvault/keyvault-certificates/samples/javascript/contacts.js index b5e6850d4f40..649a3be60355 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/contacts.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/contacts.js @@ -1,6 +1,12 @@ -const { CertificateClient } = require("../../dist"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample creates, updates and deletes certificate contacts. async function main() { diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/deleteAndRecover.js b/sdk/keyvault/keyvault-certificates/samples/javascript/deleteAndRecover.js index 3c1ea520dc7a..85dc8f3f09ce 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/deleteAndRecover.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/deleteAndRecover.js @@ -1,6 +1,12 @@ -const { CertificateClient } = require("../../dist"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample creates a self-signed certificate, then deletes it, then recovers it. // Soft-delete is required for this sample to run: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete @@ -16,7 +22,7 @@ async function main() { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate"; + const certificateName = "MyCertificateDeleteAndRecoverJS"; // Creating a self-signed certificate const createPoller = await client.beginCreateCertificate(certificateName, { diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/helloWorld.js b/sdk/keyvault/keyvault-certificates/samples/javascript/helloWorld.js index c724447d3581..ce7d2755b329 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/helloWorld.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/helloWorld.js @@ -1,6 +1,12 @@ -const { CertificateClient } = require("../../dist"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample creates a self-signed certificate, reads it in various ways, // updates the tags of the certificate and finally deletes the certificate. @@ -16,7 +22,7 @@ async function main() { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate"; + const certificateName = "MyCertificateHelloWorldJS"; // Creating a self-signed certificate const createPoller = await client.beginCreateCertificate(certificateName, { diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/issuers.js b/sdk/keyvault/keyvault-certificates/samples/javascript/issuers.js index fdf70596e2cf..c39883cf09ca 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/issuers.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/issuers.js @@ -1,6 +1,12 @@ -const { CertificateClient } = require("../../dist"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample creates, updates and deletes certificate issuers. async function main() { @@ -15,8 +21,8 @@ async function main() { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate"; - const issuerName = "issuerName"; + const certificateName = "MyCertificateIssuersJS"; + const issuerName = "issuerNameIssuersJS"; // Create await client.createIssuer(issuerName, "Test", { diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/listCertificates.js b/sdk/keyvault/keyvault-certificates/samples/javascript/listCertificates.js index 485bf5ccea6d..e4fb599411e6 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/listCertificates.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/listCertificates.js @@ -1,6 +1,12 @@ -const { CertificateClient } = require("../../dist"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample list previously created certificates in a single chunk and by page, // then changes one of them and lists all the versions of that certificate, // then deletes them, then lists the deleted certificates. @@ -17,8 +23,8 @@ async function main() { const client = new CertificateClient(url, credential); - const certificateName1 = "MyCertificate1"; - const certificateName2 = "MyCertificate2"; + const certificateName1 = "MyCertificateListCertificatesJS1"; + const certificateName2 = "MyCertificateListCertificatesJS2"; // Creating two self-signed certificates. They will appear as pending initially. await client.beginCreateCertificate(certificateName1, { @@ -43,7 +49,9 @@ async function main() { // Listing all the available certificates by pages. let pageCount = 0; - let listPropertiesOfCertificatesByPage = client.listPropertiesOfCertificates({ includePending: true }).byPage(); + let listPropertiesOfCertificatesByPage = client + .listPropertiesOfCertificates({ includePending: true }) + .byPage(); while (true) { let { done, value } = await listPropertiesOfCertificatesByPage.next(); if (done) { @@ -64,7 +72,10 @@ async function main() { console.log("Updated certificate:", updatedCertificate); // Listing a certificate's versions - let listPropertiesOfCertificateVersions = client.listPropertiesOfCertificateVersions(certificateName1, {}); + let listPropertiesOfCertificateVersions = client.listPropertiesOfCertificateVersions( + certificateName1, + {} + ); while (true) { let { done, value } = await listPropertiesOfCertificateVersions.next(); if (done) { diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/mergeCertificate.js b/sdk/keyvault/keyvault-certificates/samples/javascript/mergeCertificate.js index 42145716f0b4..cbc4aa45bb06 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/mergeCertificate.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/mergeCertificate.js @@ -1,8 +1,15 @@ +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + const fs = require("fs"); const childProcess = require("child_process"); -const { CertificateClient } = require("../../dist"); + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample creates a certificate with an Unknown issuer, then signs this certificate using a fake // certificate authority and the mergeCertificate API method. diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/operations.js b/sdk/keyvault/keyvault-certificates/samples/javascript/operations.js index 343b4ccf80ea..e9463114969c 100644 --- a/sdk/keyvault/keyvault-certificates/samples/javascript/operations.js +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/operations.js @@ -1,6 +1,12 @@ -const { CertificateClient } = require("../../dist"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { CertificateClient } = require("@azure/keyvault-certificates"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + // This sample creates, updates and deletes a certificate's operation. async function main() { @@ -14,7 +20,7 @@ async function main() { const credential = new DefaultAzureCredential(); const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate986632"; + const certificateName = "MyCertificateOperationJS"; // Certificates' operations will be pending for some time right after they're created. const createPoller = await client.beginCreateCertificate(certificateName, { diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/package.json b/sdk/keyvault/keyvault-certificates/samples/javascript/package.json new file mode 100644 index 000000000000..4b432c56b4df --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/package.json @@ -0,0 +1,35 @@ +{ + "name": "azure-keyvault-certificates-samples-js", + "private": true, + "version": "0.1.0", + "description": "Azure Key Vault Certificates client library samples for JavaScript", + "engine": { + "node": ">=8.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git" + }, + "keywords": [ + "Azure", + "Key Vault", + "Certificates", + "Node.js", + "JavaScript" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js#readme", + "sideEffects": false, + "dependencies": { + "@azure/identity": "latest", + "@azure/keyvault-certificates": "latest", + "dotenv": "^8.2.0" + }, + "devDependencies": { + "rimraf": "^3.0.0" + } +} diff --git a/sdk/keyvault/keyvault-certificates/samples/javascript/sample.env b/sdk/keyvault/keyvault-certificates/samples/javascript/sample.env new file mode 100644 index 000000000000..7fc9052cbf41 --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/javascript/sample.env @@ -0,0 +1,11 @@ +# The name of the key vault to use in the samples. +# Create a Key Vault in the Azure Portal and enter its name here. +KEYVAULT_NAME= + +# Used to authenticate using Azure AD as a service principal for role-based authentication. +# +# See the documentation for `EnvironmentCredential` at the following link: +# https://docs.microsoft.com/javascript/api/@azure/identity/environmentcredential +AZURE_TENANT_ID= +AZURE_CLIENT_ID= +AZURE_CLIENT_SECRET= diff --git a/sdk/keyvault/keyvault-certificates/samples/tsconfig.json b/sdk/keyvault/keyvault-certificates/samples/tsconfig.json new file mode 100644 index 000000000000..34e5a9c5a6df --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.samples.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "typescript/dist" + }, + "include": ["typescript/src/**.ts"], + "exclude": ["typescript/*.json", "**/node_modules/", "../node_modules", "../typings"] +} diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/README.md b/sdk/keyvault/keyvault-certificates/samples/typescript/README.md new file mode 100644 index 000000000000..ac8626679795 --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/README.md @@ -0,0 +1,93 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure + - azure-key-vault +urlFragment: keyvault-certificates-typescript +--- + +# Azure Key Vault Certificates client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Key Vault Certificates in some common scenarios. + +| **File Name** | **Description** | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [backupAndRestore.ts][backupandrestore] | creates a self-signed certificate, then makes a backup from it, then deletes it and purges it, and finally restores it | +| [contacts.ts][contacts] | creates, updates and deletes certificate contacts | +| [deleteAndRecover.ts][deleteandrecover] | creates a self-signed certificate, then deletes it, then recovers it (soft-delete is required for this sample to run, see: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete) | +| [helloWorld.ts][helloworld] | creates a self-signed certificate, reads it in various ways, updates the tags of the certificate and finally deletes the certificate | +| [issuers.ts][issuers] | creates, updates and deletes certificate issuers | +| [listCertificates.ts][listcertificates] | lists previously created certificates in a single chunk and by page, then changes one of them and lists all the versions of that certificate, then deletes them and lists the deleted certificates. | +| [mergeCertificate.ts][mergecertificate] | creates a certificate with an Unknown issuer, then signs this certificate using a fake certificate authority and the mergeCertificate API method | +| [operations.ts][operations] | creates, updates and deletes a certificate's operation | + +## Prerequisites + +The samples are compatible with Node.js >= 8.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] and [an Azure Key Vault][azkeyvault] to run these sample programs. To quickly create the needed Key Vault resources in Azure and to receive a connection string for them, you can deploy our sample template by clicking: + +[![](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-sdk-for-js%2Fmaster%2Fsdk%2Fkeyvault%2Fkeyvault-certificates%2Ftests-resources.json) + +If creating the Key Vault manually using the Azure Portal, be aware that the samples require that the soft-delete feature be enabled. Our template above will enable this feature automatically, but it is possible to enable it manually using the Azure CLI. See [this page][kvsoftdelete] for more information. + +Samples retrieve credentials to access the Key Vault from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/helloWorld.js +``` + +Alternatively, run a single sample with the correct environment variables set (step 3 is not required if you do this), for example (cross-platform): + +```bash +npx cross-env KEYVAULT_NAME="" AZURE_TENANT_ID="" AZURE_CLIENT_ID="" AZURE_CLIENT_SECRET="" node dist/helloWorld.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[backupandrestore]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/backupAndRestore.ts +[contacts]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/contacts.ts +[deleteandrecover]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/deleteAndRecover.ts +[helloworld]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/helloWorld.ts +[issuers]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/issuers.ts +[listcertificates]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/listCertificates.ts +[mergecertificate]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/mergeCertificate.ts +[operations]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/samples/typescript/src/operations.ts +[apiref]: https://docs.microsoft.com/javascript/api/@azure/keyvault-certificates +[azkeyvault]: https://docs.microsoft.com/azure/key-vault/quick-create-portal +[kvsoftdelete]: https://docs.microsoft.com/azure/key-vault/key-vault-soft-delete-cli +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-certificates/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/package.json b/sdk/keyvault/keyvault-certificates/samples/typescript/package.json new file mode 100644 index 000000000000..e1ee33ab5e1f --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/package.json @@ -0,0 +1,41 @@ +{ + "name": "azure-keyvault-certificates-samples-ts", + "private": true, + "version": "0.1.0", + "description": "Azure Key Vault Certificates client library samples for TypeScript", + "engine": { + "node": ">=8.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git" + }, + "keywords": [ + "Azure", + "Key Vault", + "Certificates", + "Node.js", + "TypeScript" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js#readme", + "sideEffects": false, + "dependencies": { + "@azure/identity": "latest", + "@azure/keyvault-certificates": "latest", + "dotenv": "^8.2.0" + }, + "devDependencies": { + "@types/node": "^8.0.0", + "rimraf": "^3.0.0", + "typescript": "~3.6.4" + } +} diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/sample.env b/sdk/keyvault/keyvault-certificates/samples/typescript/sample.env new file mode 100644 index 000000000000..7fc9052cbf41 --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/sample.env @@ -0,0 +1,11 @@ +# The name of the key vault to use in the samples. +# Create a Key Vault in the Azure Portal and enter its name here. +KEYVAULT_NAME= + +# Used to authenticate using Azure AD as a service principal for role-based authentication. +# +# See the documentation for `EnvironmentCredential` at the following link: +# https://docs.microsoft.com/javascript/api/@azure/identity/environmentcredential +AZURE_TENANT_ID= +AZURE_CLIENT_ID= +AZURE_CLIENT_SECRET= diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/backupAndRestore.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/backupAndRestore.ts similarity index 83% rename from sdk/keyvault/keyvault-certificates/samples/typescript/backupAndRestore.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/backupAndRestore.ts index 276d7780037c..6ebd2346169b 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/backupAndRestore.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/backupAndRestore.ts @@ -1,6 +1,13 @@ -import { CertificateClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { CertificateClient } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample creates a self-signed certificate, then makes a backup from it, // then deletes it and purges it, and finally restores it. @@ -8,7 +15,7 @@ function delay(t: number, value?: T): Promise { return new Promise((resolve) => setTimeout(() => resolve(value), t)); } -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -20,7 +27,7 @@ async function main(): Promise { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate126342"; + const certificateName = "MyCertificateBackupAndRestoreTS"; // Creating a self-signed certificate const createPoller = await client.beginCreateCertificate(certificateName, { diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/contacts.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/contacts.ts similarity index 83% rename from sdk/keyvault/keyvault-certificates/samples/typescript/contacts.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/contacts.ts index 6e7a31d59ad1..920f40b47950 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/contacts.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/contacts.ts @@ -1,9 +1,16 @@ -import { CertificateClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { CertificateClient } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample creates, updates and deletes certificate contacts. -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/deleteAndRecover.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/deleteAndRecover.ts similarity index 83% rename from sdk/keyvault/keyvault-certificates/samples/typescript/deleteAndRecover.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/deleteAndRecover.ts index 147e62d6c069..8f0899f01aed 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/deleteAndRecover.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/deleteAndRecover.ts @@ -1,10 +1,17 @@ -import { CertificateClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { CertificateClient } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample creates a self-signed certificate, then deletes it, then recovers it. // Soft-delete is required for this sample to run: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -16,7 +23,7 @@ async function main(): Promise { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate"; + const certificateName = "MyCertificateDeleteAndRecoverTS"; // Creating a self-signed certificate const createPoller = await client.beginCreateCertificate(certificateName, { diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/helloWorld.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/helloWorld.ts similarity index 84% rename from sdk/keyvault/keyvault-certificates/samples/typescript/helloWorld.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/helloWorld.ts index 29f221d4c188..e69ed2d77bfb 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/helloWorld.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/helloWorld.ts @@ -1,10 +1,17 @@ -import { CertificateClient, DefaultCertificatePolicy } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { CertificateClient, DefaultCertificatePolicy } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample creates a self-signed certificate, reads it in various ways, // updates the tags of the certificate and finally deletes the certificate. -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -16,10 +23,13 @@ async function main(): Promise { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate"; + const certificateName = "MyCertificateHelloWorldTS"; // Creating a self-signed certificate - const createPoller = await client.beginCreateCertificate(certificateName, DefaultCertificatePolicy); + const createPoller = await client.beginCreateCertificate( + certificateName, + DefaultCertificatePolicy + ); const pendingCertificate = createPoller.getResult(); console.log("Certificate: ", pendingCertificate); diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/issuers.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/issuers.ts similarity index 80% rename from sdk/keyvault/keyvault-certificates/samples/typescript/issuers.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/issuers.ts index e5b90f1b2299..3884bfc7325b 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/issuers.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/issuers.ts @@ -1,9 +1,16 @@ -import { CertificateClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { CertificateClient } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample creates, updates and deletes certificate issuers. -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -15,8 +22,8 @@ async function main(): Promise { const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate"; - const issuerName = "issuerName"; + const certificateName = "MyCertificateIssuersTS"; + const issuerName = "issuerNameIssuersTS"; // Create await client.createIssuer(issuerName, "Test", { @@ -45,7 +52,7 @@ async function main(): Promise { // We can also list properties for all issuers: for await (const issuerProperties of client.listPropertiesOfIssuers()) { - console.log("Certificate properties: ", issuerProperties) + console.log("Certificate properties: ", issuerProperties); } // We can also delete the issuer. diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/listCertificates.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/listCertificates.ts similarity index 75% rename from sdk/keyvault/keyvault-certificates/samples/typescript/listCertificates.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/listCertificates.ts index 4fece092512f..b9cbf8e179c9 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/listCertificates.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/listCertificates.ts @@ -1,11 +1,18 @@ -import { CertificateClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { CertificateClient } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample list previously created certificates in a single chunk and by page, // then changes one of them and lists all the versions of that certificate, // then deletes them, then lists the deleted certificates. -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -17,12 +24,15 @@ async function main(): Promise { const client = new CertificateClient(url, credential); + const certificateName1 = "MyCertificateLIstCertificatesTS1"; + const certificateName2 = "MyCertificateLIstCertificatesTS2"; + // Creating two self-signed certificates. They will appear as pending initially. - await client.beginCreateCertificate("MyCertificate1", { + await client.beginCreateCertificate(certificateName1, { issuerName: "Self", subject: "cn=MyCert" }); - await client.beginCreateCertificate("MyCertificate2", { + await client.beginCreateCertificate(certificateName2, { issuerName: "Self", subject: "cn=MyCert" }); @@ -43,7 +53,7 @@ async function main(): Promise { } // Updating one of the certificates to retrieve the certificate versions afterwards - const updatedCertificate = await client.updateCertificateProperties("MyCertificate1", "", { + const updatedCertificate = await client.updateCertificateProperties(certificateName1, "", { tags: { customTag: "value" } @@ -51,16 +61,16 @@ async function main(): Promise { console.log("Updated certificate:", updatedCertificate); // Listing a certificate's versions - for await (const item of client.listPropertiesOfCertificateVersions("MyCertificate1", {})) { + for await (const item of client.listPropertiesOfCertificateVersions(certificateName1, {})) { const version = item.version!; - const certificate = await client.getCertificateVersion("MyCertificate1", version); + const certificate = await client.getCertificateVersion(certificateName1, version); console.log(`Certificate from version ${version}: `, certificate); } // Deleting both certificates - let deletePoller = await client.beginDeleteCertificate("MyCertificate1"); + let deletePoller = await client.beginDeleteCertificate(certificateName1); await deletePoller.pollUntilDone(); - deletePoller = await client.beginDeleteCertificate("MyCertificate2"); + deletePoller = await client.beginDeleteCertificate(certificateName2); await deletePoller.pollUntilDone(); for await (const certificate of client.listDeletedCertificates({ includePending: true })) { diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/mergeCertificate.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/mergeCertificate.ts similarity index 80% rename from sdk/keyvault/keyvault-certificates/samples/typescript/mergeCertificate.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/mergeCertificate.ts index 4cc8de63cc31..4d4f6606bf58 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/mergeCertificate.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/mergeCertificate.ts @@ -1,12 +1,20 @@ +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + import * as fs from "fs"; import * as childProcess from "child_process"; -import { CertificateClient } from "../../src"; + +import { CertificateClient } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample creates a certificate with an Unknown issuer, then signs this certificate using a fake // certificate authority and the mergeCertificate API method. -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -18,15 +26,17 @@ async function main(): Promise { const client = new CertificateClient(url, credential); + const certificateName = "MyCertificateMergeCertificateTS"; + // Creating a certificate with an Unknown issuer. - await client.beginCreateCertificate("MyCertificate", { + await client.beginCreateCertificate(certificateName, { issuerName: "Unknown", certificateTransparency: false, subject: "cn=MyCert" }); // Retrieving the certificate's signing request - const operationPoller = await client.getCertificateOperation("MyCertificate"); + const operationPoller = await client.getCertificateOperation(certificateName); const { csr } = operationPoller.getOperationState().certificateOperation!; const base64Csr = Buffer.from(csr!).toString("base64"); const wrappedCsr = `-----BEGIN CERTIFICATE REQUEST----- @@ -55,7 +65,7 @@ ${base64Csr} .join(""); // Once we have the response in base64 format, we send it to mergeCertificate - await client.mergeCertificate("MyCertificate", [Buffer.from(base64Crt)]); + await client.mergeCertificate(certificateName, [Buffer.from(base64Crt)]); } main().catch((err) => { diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/operations.ts b/sdk/keyvault/keyvault-certificates/samples/typescript/src/operations.ts similarity index 86% rename from sdk/keyvault/keyvault-certificates/samples/typescript/operations.ts rename to sdk/keyvault/keyvault-certificates/samples/typescript/src/operations.ts index 1d581c7f29c8..3e8f61786295 100644 --- a/sdk/keyvault/keyvault-certificates/samples/typescript/operations.ts +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/src/operations.ts @@ -1,9 +1,16 @@ -import { CertificateClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { CertificateClient } from "@azure/keyvault-certificates"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + // This sample creates, updates and deletes a certificate's operation. -async function main(): Promise { +export async function main(): Promise { // If you're using MSI, DefaultAzureCredential should "just work". // Otherwise, DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -14,7 +21,7 @@ async function main(): Promise { const credential = new DefaultAzureCredential(); const client = new CertificateClient(url, credential); - const certificateName = "MyCertificate"; + const certificateName = "MyCertificateOperationsTS"; // Certificates' operations will be pending for some time right after they're created. const createPoller = await client.beginCreateCertificate(certificateName, { diff --git a/sdk/keyvault/keyvault-certificates/samples/typescript/tsconfig.json b/sdk/keyvault/keyvault-certificates/samples/typescript/tsconfig.json new file mode 100644 index 000000000000..4332663bf7b7 --- /dev/null +++ b/sdk/keyvault/keyvault-certificates/samples/typescript/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "node", + + "lib": ["dom", "dom.iterable", "esnext.asynciterable"], + + "allowSyntheticDefaultImports": true, + + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/keyvault/keyvault-keys/package.json b/sdk/keyvault/keyvault-keys/package.json index d7a1a3322ff9..50bcef33678c 100644 --- a/sdk/keyvault/keyvault-keys/package.json +++ b/sdk/keyvault/keyvault-keys/package.json @@ -40,14 +40,16 @@ "scripts": { "audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit", "build:minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js 2>&1", - "build:samples": "tsc -p tsconfig.samples.json", + "build:samples": "node ../../../common/scripts/prep-samples.js && cd samples && tsc", "build:es6": "tsc -p tsconfig.json", "build:nodebrowser": "rollup -c 2>&1", "build:test": "npm run build:es6 && rollup -c rollup.test.config.js 2>&1", - "build": "npm run extract-api && npm run build:samples && npm run build:es6 && npm run build:nodebrowser", + "build": "npm run extract-api && npm run build:es6 && npm run build:nodebrowser", "check-format": "prettier --list-different --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "clean": "rimraf dist dist-esm dist-test types *.tgz *.log browser statistics.html coverage && rimraf src/**/*.js && rimraf test/**/*.js", - "execute:samples": "echo skipped", + "execute:js-samples": "node ../../../common/scripts/run-samples.js samples/javascript/", + "execute:ts-samples": "node ../../../common/scripts/run-samples.js samples/typescript/dist/samples/typescript/src/", + "execute:samples": "npm run build:samples && npm run execute:js-samples && npm run execute:ts-samples", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "integration-test:browser": "karma start --single-run", diff --git a/sdk/keyvault/keyvault-keys/samples/javascript/README.md b/sdk/keyvault/keyvault-keys/samples/javascript/README.md new file mode 100644 index 000000000000..a865141111ef --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/javascript/README.md @@ -0,0 +1,68 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure + - azure-key-vault +urlFragment: keyvault-keys-javascript +--- + +# Azure Key Vault Keys client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Key Vault Keys in some common scenarios. + +| **File Name** | **Description** | +| ------------------------------- | ---------------------------------------------------------------- | +| [cryptography.js][cryptography] | uses a key to sign/verify, encrypt/decrypt, and wrap/unwrap data | +| [helloWorld.js][helloworld] | creates, reads, lists, and deletes keys | + +## Prerequisites + +The samples are compatible with Node.js >= 8.0.0. + +You need [an Azure subscription][freesub] and [an Azure Key Vault][azkeyvault] to run these sample programs. To quickly create the needed Key Vault resources in Azure and to receive a connection string for them, you can deploy our sample template by clicking: + +[![](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-sdk-for-js%2Fmaster%2Fsdk%2Fkeyvault%2Fkeyvault-certificates%2Ftests-resources.json) + +If creating the Key Vault manually using the Azure Portal, be aware that the samples require that the soft-delete feature be enabled. Our template above will enable this feature automatically, but it is possible to enable it manually using the Azure CLI. See [this page][kvsoftdelete] for more information. + +Samples retrieve credentials to access the Key Vault from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node helloWorld.js +``` + +Alternatively, run a single sample with the correct environment variables set (step 2 is not required if you do this), for example (cross-platform): + +```bash +npx cross-env KEYVAULT_NAME="" AZURE_TENANT_ID="" AZURE_CLIENT_ID="" AZURE_CLIENT_SECRET="" node helloWorld.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[cryptography]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/javascript/cryptography.js +[helloworld]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/javascript/helloWorld.js +[apiref]: https://docs.microsoft.com/javascript/api/@azure/keyvault-keys +[azkeyvault]: https://docs.microsoft.com/azure/key-vault/quick-create-portal +[kvsoftdelete]: https://docs.microsoft.com/azure/key-vault/key-vault-soft-delete-cli +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/README.md diff --git a/sdk/keyvault/keyvault-keys/samples/javascript/cryptography.js b/sdk/keyvault/keyvault-keys/samples/javascript/cryptography.js index 875c0fae0cd7..b4af8cdffe38 100644 --- a/sdk/keyvault/keyvault-keys/samples/javascript/cryptography.js +++ b/sdk/keyvault/keyvault-keys/samples/javascript/cryptography.js @@ -1,7 +1,14 @@ -const { KeyClient, CryptographyClient } = require("../../src"); -const { DefaultAzureCredential } = require("@azure/identity"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + const crypto = require("crypto"); +const { KeyClient, CryptographyClient } = require("@azure/keyvault-keys"); +const { DefaultAzureCredential } = require("@azure/identity"); + +// Load the .env file if it exists +require("dotenv").config(); + async function main() { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -50,8 +57,9 @@ async function main() { const unwrapped = await cryptoClient.unwrapKey("RSA-OAEP", wrapped.result); console.log("unwrap result: ", unwrapped); - await client.beginDeleteKey(keyName) + await client.beginDeleteKey(keyName); } + main().catch((err) => { console.log("error code: ", err.code); console.log("error message: ", err.message); diff --git a/sdk/keyvault/keyvault-keys/samples/javascript/helloWorld.js b/sdk/keyvault/keyvault-keys/samples/javascript/helloWorld.js index 1a6a1afed3e4..5306d71d773e 100644 --- a/sdk/keyvault/keyvault-keys/samples/javascript/helloWorld.js +++ b/sdk/keyvault/keyvault-keys/samples/javascript/helloWorld.js @@ -1,6 +1,12 @@ -const { KeyClient } = require("../../src"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { KeyClient } = require("@azure/keyvault-keys"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + async function main() { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -12,9 +18,9 @@ async function main() { const url = `https://${vaultName}.vault.azure.net`; const client = new KeyClient(url, credential); - const keyName = "MyKeyName53"; - const ecKeyName = "MyECKeyName53"; - const rsaKeyName = "MyRSAKeyName53"; + const keyName = "MyKeyNameCertificates"; + const ecKeyName = "MyECKeyNameCertificates"; + const rsaKeyName = "MyRSAKeyNameCertificates"; // You can create keys using the general method const result = await client.createKey(keyName, "EC"); @@ -43,7 +49,9 @@ async function main() { } // Update the key - const updatedKey = await client.updateKeyProperties(keyName, result.properties.version, { enabled: false }); + const updatedKey = await client.updateKeyProperties(keyName, result.properties.version, { + enabled: false + }); console.log("updated key: ", updatedKey); await client.beginDeleteKey(keyName); diff --git a/sdk/keyvault/keyvault-keys/samples/javascript/package.json b/sdk/keyvault/keyvault-keys/samples/javascript/package.json new file mode 100644 index 000000000000..7a50c92b06b4 --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/javascript/package.json @@ -0,0 +1,35 @@ +{ + "name": "azure-keyvault-keys-samples-js", + "private": true, + "version": "0.1.0", + "description": "Azure Key Vault Keys client library samples for JavaScript", + "engine": { + "node": ">=8.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git" + }, + "keywords": [ + "Azure", + "Key Vault", + "Keys", + "Node.js", + "JavaScript" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js#readme", + "sideEffects": false, + "dependencies": { + "@azure/identity": "latest", + "@azure/keyvault-keys": "latest", + "dotenv": "^8.2.0" + }, + "devDependencies": { + "rimraf": "^3.0.0" + } +} diff --git a/sdk/keyvault/keyvault-keys/samples/javascript/sample.env b/sdk/keyvault/keyvault-keys/samples/javascript/sample.env new file mode 100644 index 000000000000..7fc9052cbf41 --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/javascript/sample.env @@ -0,0 +1,11 @@ +# The name of the key vault to use in the samples. +# Create a Key Vault in the Azure Portal and enter its name here. +KEYVAULT_NAME= + +# Used to authenticate using Azure AD as a service principal for role-based authentication. +# +# See the documentation for `EnvironmentCredential` at the following link: +# https://docs.microsoft.com/javascript/api/@azure/identity/environmentcredential +AZURE_TENANT_ID= +AZURE_CLIENT_ID= +AZURE_CLIENT_SECRET= diff --git a/sdk/keyvault/keyvault-keys/samples/tsconfig.json b/sdk/keyvault/keyvault-keys/samples/tsconfig.json new file mode 100644 index 000000000000..34e5a9c5a6df --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.samples.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "typescript/dist" + }, + "include": ["typescript/src/**.ts"], + "exclude": ["typescript/*.json", "**/node_modules/", "../node_modules", "../typings"] +} diff --git a/sdk/keyvault/keyvault-keys/samples/typescript/README.md b/sdk/keyvault/keyvault-keys/samples/typescript/README.md new file mode 100644 index 000000000000..9c9633fdc7a0 --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/typescript/README.md @@ -0,0 +1,81 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure + - azure-key-vault +urlFragment: keyvault-keys-typescript +--- + +# Azure Key Vault Keys client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Key Vault Keys in some common scenarios. + +| **File Name** | **Description** | +| ------------------------------- | ---------------------------------------------------------------- | +| [cryptography.ts][cryptography] | uses a key to sign/verify, encrypt/decrypt, and wrap/unwrap data | +| [helloWorld.ts][helloworld] | creates, reads, lists, and deletes keys | + +## Prerequisites + +The samples are compatible with Node.js >= 8.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] and [an Azure Key Vault][azkeyvault] to run these sample programs. To quickly create the needed Key Vault resources in Azure and to receive a connection string for them, you can deploy our sample template by clicking: + +[![](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-sdk-for-js%2Fmaster%2Fsdk%2Fkeyvault%2Fkeyvault-certificates%2Ftests-resources.json) + +If creating the Key Vault manually using the Azure Portal, be aware that the samples require that the soft-delete feature be enabled. Our template above will enable this feature automatically, but it is possible to enable it manually using the Azure CLI. See [this page][kvsoftdelete] for more information. + +Samples retrieve credentials to access the Key Vault from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/helloWorld.js +``` + +Alternatively, run a single sample with the correct environment variables set (step 3 is not required if you do this), for example (cross-platform): + +```bash +npx cross-env KEYVAULT_NAME="" AZURE_TENANT_ID="" AZURE_CLIENT_ID="" AZURE_CLIENT_SECRET="" node dist/helloWorld.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[cryptography]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/typescript/src/cryptography.ts +[helloworld]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/typescript/src/helloWorld.ts +[apiref]: https://docs.microsoft.com/javascript/api/@azure/keyvault-keys +[azkeyvault]: https://docs.microsoft.com/azure/key-vault/quick-create-portal +[kvsoftdelete]: https://docs.microsoft.com/azure/key-vault/key-vault-soft-delete-cli +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/keyvault/keyvault-keys/samples/typescript/package.json b/sdk/keyvault/keyvault-keys/samples/typescript/package.json new file mode 100644 index 000000000000..b29f7d79d177 --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/typescript/package.json @@ -0,0 +1,41 @@ +{ + "name": "azure-keyvault-keys-samples-ts", + "private": true, + "version": "0.1.0", + "description": "Azure Key Vault Keys client library samples for TypeScript", + "engine": { + "node": ">=8.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git" + }, + "keywords": [ + "Azure", + "Key Vault", + "Keys", + "Node.js", + "TypeScript" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js#readme", + "sideEffects": false, + "dependencies": { + "@azure/identity": "latest", + "@azure/keyvault-keys": "latest", + "dotenv": "^8.2.0" + }, + "devDependencies": { + "@types/node": "^8.0.0", + "rimraf": "^3.0.0", + "typescript": "~3.6.4" + } +} diff --git a/sdk/keyvault/keyvault-keys/samples/typescript/sample.env b/sdk/keyvault/keyvault-keys/samples/typescript/sample.env new file mode 100644 index 000000000000..7fc9052cbf41 --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/typescript/sample.env @@ -0,0 +1,11 @@ +# The name of the key vault to use in the samples. +# Create a Key Vault in the Azure Portal and enter its name here. +KEYVAULT_NAME= + +# Used to authenticate using Azure AD as a service principal for role-based authentication. +# +# See the documentation for `EnvironmentCredential` at the following link: +# https://docs.microsoft.com/javascript/api/@azure/identity/environmentcredential +AZURE_TENANT_ID= +AZURE_CLIENT_ID= +AZURE_CLIENT_SECRET= diff --git a/sdk/keyvault/keyvault-keys/samples/typescript/cryptography.ts b/sdk/keyvault/keyvault-keys/samples/typescript/src/cryptography.ts similarity index 85% rename from sdk/keyvault/keyvault-keys/samples/typescript/cryptography.ts rename to sdk/keyvault/keyvault-keys/samples/typescript/src/cryptography.ts index 3e93245415c9..0ef3d303f144 100644 --- a/sdk/keyvault/keyvault-keys/samples/typescript/cryptography.ts +++ b/sdk/keyvault/keyvault-keys/samples/typescript/src/cryptography.ts @@ -1,8 +1,16 @@ -import { KeyClient, CryptographyClient } from "../../src"; -import { DefaultAzureCredential } from "@azure/identity"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + import { createHash } from "crypto"; -async function main(): Promise { +import { KeyClient, CryptographyClient } from "@azure/keyvault-keys"; +import { DefaultAzureCredential } from "@azure/identity"; + +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + +export async function main(): Promise { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant @@ -50,8 +58,9 @@ async function main(): Promise { const unwrapped = await cryptoClient.unwrapKey("RSA-OAEP", wrapped.result); console.log("unwrap result: ", unwrapped); - await client.beginDeleteKey(keyName) + await client.beginDeleteKey(keyName); } + main().catch((err) => { console.log("error code: ", err.code); console.log("error message: ", err.message); diff --git a/sdk/keyvault/keyvault-keys/samples/typescript/helloWorld.ts b/sdk/keyvault/keyvault-keys/samples/typescript/src/helloWorld.ts similarity index 80% rename from sdk/keyvault/keyvault-keys/samples/typescript/helloWorld.ts rename to sdk/keyvault/keyvault-keys/samples/typescript/src/helloWorld.ts index b68d0248f28b..8bb538a76044 100644 --- a/sdk/keyvault/keyvault-keys/samples/typescript/helloWorld.ts +++ b/sdk/keyvault/keyvault-keys/samples/typescript/src/helloWorld.ts @@ -1,7 +1,14 @@ -import { KeyClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { KeyClient } from "@azure/keyvault-keys"; import { DefaultAzureCredential } from "@azure/identity"; -async function main(): Promise { +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + +export async function main(): Promise { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant @@ -12,9 +19,9 @@ async function main(): Promise { const url = `https://${vaultName}.vault.azure.net`; const client = new KeyClient(url, credential); - const keyName = "MyKeyName"; - const ecKeyName = "MyECKeyName"; - const rsaKeyName = "MyRSAKeyName"; + const keyName = "MyKeyNameCertificates"; + const ecKeyName = "MyECKeyNameCertificates"; + const rsaKeyName = "MyRSAKeyNameCertificates"; // You can create keys using the general method const result = await client.createKey(keyName, "EC"); diff --git a/sdk/keyvault/keyvault-keys/samples/typescript/tsconfig.json b/sdk/keyvault/keyvault-keys/samples/typescript/tsconfig.json new file mode 100644 index 000000000000..4332663bf7b7 --- /dev/null +++ b/sdk/keyvault/keyvault-keys/samples/typescript/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "node", + + "lib": ["dom", "dom.iterable", "esnext.asynciterable"], + + "allowSyntheticDefaultImports": true, + + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**.ts"], + "exclude": ["node_modules"] +} diff --git a/sdk/keyvault/keyvault-secrets/package.json b/sdk/keyvault/keyvault-secrets/package.json index cbbc08107629..9428680388af 100644 --- a/sdk/keyvault/keyvault-secrets/package.json +++ b/sdk/keyvault/keyvault-secrets/package.json @@ -40,14 +40,16 @@ "scripts": { "audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit", "build:minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js 2>&1", - "build:samples": "tsc -p tsconfig.samples.json", + "build:samples": "node ../../../common/scripts/prep-samples.js && cd samples && tsc", "build:es6": "tsc -p tsconfig.json", "build:nodebrowser": "rollup -c 2>&1", "build:test": "npm run build:es6 && rollup -c rollup.test.config.js 2>&1", - "build": "npm run extract-api && npm run build:samples && npm run build:es6 && npm run build:nodebrowser", + "build": "npm run extract-api && npm run build:es6 && npm run build:nodebrowser", "check-format": "prettier --list-different --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "clean": "rimraf dist dist-esm dist-test types *.tgz *.log browser statistics.html coverage && rimraf src/**/*.js && rimraf test/**/*.js", - "execute:samples": "echo skipped", + "execute:js-samples": "node ../../../common/scripts/run-samples.js samples/javascript/", + "execute:ts-samples": "node ../../../common/scripts/run-samples.js samples/typescript/dist/samples/typescript/src/", + "execute:samples": "npm run build:samples && echo Skipped.", "extract-api": "tsc -p . && api-extractor run --local", "format": "prettier --write --config ../../.prettierrc.json \"src/**/*.ts\" \"test/**/*.ts\" \"*.{js,json}\"", "integration-test:browser": "karma start --single-run", diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/README.md b/sdk/keyvault/keyvault-secrets/samples/javascript/README.md new file mode 100644 index 000000000000..dd17847ede77 --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/javascript/README.md @@ -0,0 +1,72 @@ +--- +page_type: sample +languages: + - javascript +products: + - azure + - azure-key-vault +urlFragment: keyvault-secrets-javascript +--- + +# Azure Key Vault Secrets client library samples for JavaScript + +These sample programs show how to use the JavaScript client libraries for Azure Key Vault Secrets in some common scenarios. + +| **File Name** | **Description** | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [backupAndRestore.js][backupandrestore] | creates a secret, then makes a backup from it, then deletes it and purges it, and finally restores it | +| [deleteAndRecover.js][deleteandrecover] | creates a secret, then deletes it, then recovers it (soft-delete is required for this sample to run, see: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete) | +| [helloWorld.js][helloworld] | creates, reads, updates, and deletes a secret | +| [listOperations.js][listoperations] | creates a secret and shows various ways to iterate over the secret and its versions | + +## Prerequisites + +The samples are compatible with Node.js >= 8.0.0. + +You need [an Azure subscription][freesub] and [an Azure Key Vault][azkeyvault] to run these sample programs. To quickly create the needed Key Vault resources in Azure and to receive a connection string for them, you can deploy our sample template by clicking: + +[![](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-sdk-for-js%2Fmaster%2Fsdk%2Fkeyvault%2Fkeyvault-secrets%2Ftests-resources.json) + +If creating the Key Vault manually using the Azure Portal, be aware that the samples require that the soft-delete feature be enabled. Our template above will enable this feature automatically, but it is possible to enable it manually using the Azure CLI. See [this page](kvsoftdelete) for more information. + +Samples retrieve credentials to access the Key Vault from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +3. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node helloWorld.js +``` + +Alternatively, run a single sample with the correct environment variables set (step 2 is not required if you do this), for example (cross-platform): + +```bash +npx cross-env KEYVAULT_NAME="" AZURE_TENANT_ID="" AZURE_CLIENT_ID="" AZURE_CLIENT_SECRET="" node helloWorld.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[backupandrestore]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/javascript/backupAndRestore.js +[deleteandrecover]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/javascript/deleteAndRecover.js +[helloworld]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/javascript/helloWorld.js +[listoperations]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keys/samples/javascript/listOperations.js +[apiref]: https://docs.microsoft.com/javascript/api/@azure/keyvault-secrets +[azkeyvault]: https://docs.microsoft.com/azure/key-vault/quick-create-portal +[kvsoftdelete]: https://docs.microsoft.com/azure/key-vault/key-vault-soft-delete-cli +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-secrets/README.md diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/backupAndRestore.js b/sdk/keyvault/keyvault-secrets/samples/javascript/backupAndRestore.js index b181902b77a8..56b26af53fb2 100644 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/backupAndRestore.js +++ b/sdk/keyvault/keyvault-secrets/samples/javascript/backupAndRestore.js @@ -1,7 +1,14 @@ -const { SecretClient } = require("../../src"); -const { DefaultAzureCredential } = require("@azure/identity"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + const fs = require("fs"); +const { SecretClient } = require("@azure/keyvault-secrets"); +const { DefaultAzureCredential } = require("@azure/identity"); + +// Load the .env file if it exists +require("dotenv").config(); + function writeFile(filename, text) { return new Promise((resolve, reject) => { fs.writeFile(filename, text, (err) => { @@ -35,7 +42,7 @@ async function main() { const url = `https://${vaultName}.vault.azure.net`; const client = new SecretClient(url, credential); - const secretName = "StorageAccountPassword19312312"; + const secretName = "secretBackupAndRestoreJS"; // Create our secret await client.setSecret(secretName, "XYZ789"); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js b/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js index e8381dc61add..31a9a8d9daa9 100644 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js +++ b/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js @@ -1,6 +1,12 @@ -const { SecretClient } = require("../../src"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { SecretClient } = require("@azure/keyvault-secrets"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + function delay(t, value) { return new Promise((resolve) => setTimeout(() => resolve(value), t)); } @@ -16,8 +22,8 @@ async function main() { const url = `https://${vaultName}.vault.azure.net`; const client = new SecretClient(url, credential); - const bankAccountSecretName = "BankAccountPassword1112923"; - const storageAccountSecretName = "StorageAccountPassword1112923"; + const bankAccountSecretName = "secretDeleteAndRecoverJS1"; + const storageAccountSecretName = "secretDeleteAndRecoverJS2"; // Create our secrets console.log("Creating our secrets"); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js b/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js index 5603ee916fc9..3fdf3e2d4e44 100644 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js +++ b/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js @@ -1,6 +1,12 @@ -const { SecretClient } = require("../../src"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { SecretClient } = require("@azure/keyvault-secrets"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + async function main() { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -14,7 +20,7 @@ async function main() { const client = new SecretClient(url, credential); // Create a secret - const secretName = "MySecretName91231"; + const secretName = "secretHelloWorldJS"; const result = await client.setSecret(secretName, "MySecretValue"); console.log("result: ", result); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js b/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js index 5e1a8776e0db..d3d3541c19e2 100644 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js +++ b/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js @@ -1,6 +1,12 @@ -const { SecretClient } = require("../../src"); +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +const { SecretClient } = require("@azure/keyvault-secrets"); const { DefaultAzureCredential } = require("@azure/identity"); +// Load the .env file if it exists +require("dotenv").config(); + async function main() { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory @@ -12,8 +18,8 @@ async function main() { const url = `https://${vaultName}.vault.azure.net`; const client = new SecretClient(url, credential); - const bankAccountSecretName = "BankAccountPassword151231"; - const storageAccountSecretName = "StorageAccountPassword151231"; + const bankAccountSecretName = "secretListOperations1"; + const storageAccountSecretName = "secretListOperations2"; // Create our secrets await client.setSecret(bankAccountSecretName, "ABC123"); @@ -59,8 +65,10 @@ async function main() { break; } - const secret = await client.getSecret(value.name); - console.log("version: ", secret); + if (value.enabled) { + const secret = await client.getSecret(value.name); + console.log("version: ", secret); + } } await client.beginDeleteSecret(bankAccountSecretName); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/package.json b/sdk/keyvault/keyvault-secrets/samples/javascript/package.json new file mode 100644 index 000000000000..4c0fb370ab8d --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/javascript/package.json @@ -0,0 +1,35 @@ +{ + "name": "azure-keyvault-secrets-samples-js", + "private": true, + "version": "0.1.0", + "description": "Azure Key Vault Secrets client library samples for JavaScript", + "engine": { + "node": ">=8.0.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git" + }, + "keywords": [ + "Azure", + "Key Vault", + "Secrets", + "Node.js", + "JavaScript" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js#readme", + "sideEffects": false, + "dependencies": { + "@azure/identity": "latest", + "@azure/keyvault-secrets": "latest", + "dotenv": "^8.2.0" + }, + "devDependencies": { + "rimraf": "^3.0.0" + } +} diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/sample.env b/sdk/keyvault/keyvault-secrets/samples/javascript/sample.env new file mode 100644 index 000000000000..7fc9052cbf41 --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/javascript/sample.env @@ -0,0 +1,11 @@ +# The name of the key vault to use in the samples. +# Create a Key Vault in the Azure Portal and enter its name here. +KEYVAULT_NAME= + +# Used to authenticate using Azure AD as a service principal for role-based authentication. +# +# See the documentation for `EnvironmentCredential` at the following link: +# https://docs.microsoft.com/javascript/api/@azure/identity/environmentcredential +AZURE_TENANT_ID= +AZURE_CLIENT_ID= +AZURE_CLIENT_SECRET= diff --git a/sdk/keyvault/keyvault-secrets/samples/tsconfig.json b/sdk/keyvault/keyvault-secrets/samples/tsconfig.json new file mode 100644 index 000000000000..34e5a9c5a6df --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.samples.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "typescript/dist" + }, + "include": ["typescript/src/**.ts"], + "exclude": ["typescript/*.json", "**/node_modules/", "../node_modules", "../typings"] +} diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/README.md b/sdk/keyvault/keyvault-secrets/samples/typescript/README.md new file mode 100644 index 000000000000..dee342ec4bad --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/README.md @@ -0,0 +1,85 @@ +--- +page_type: sample +languages: + - typescript +products: + - azure + - azure-key-vault +urlFragment: keyvault-secrets-typescript +--- + +# Azure Key Vault Secrets client library samples for TypeScript + +These sample programs show how to use the TypeScript client libraries for Azure Key Vault Secrets in some common scenarios. + +| **File Name** | **Description** | +| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [backupAndRestore.ts][backupandrestore] | creates a secret, then makes a backup from it, then deletes it and purges it, and finally restores it | +| [deleteAndRecover.ts][deleteandrecover] | creates a secret, then deletes it, then recovers it (soft-delete is required for this sample to run, see: https://docs.microsoft.com/en-us/azure/key-vault/key-vault-ovw-soft-delete) | +| [helloWorld.ts][helloworld] | creates, reads, updates, and deletes a secret | +| [listOperations.ts][listoperations] | creates a secret and shows various ways to iterate over the secret and its versions | + +## Prerequisites + +The samples are compatible with Node.js >= 8.0.0. + +Before running the samples in Node, they must be compiled to JavaScript using the TypeScript compiler. For more information on TypeScript, see the [TypeScript documentation][typescript]. Install the TypeScript compiler using + +```bash +npm install -g typescript +``` + +You need [an Azure subscription][freesub] and [an Azure Key Vault][azkeyvault] to run these sample programs. To quickly create the needed Key Vault resources in Azure and to receive a connection string for them, you can deploy our sample template by clicking: + +[![](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-sdk-for-js%2Fmaster%2Fsdk%2Fkeyvault%2Fkeyvault-secrets%2Ftests-resources.json) + +If creating the Key Vault manually using the Azure Portal, be aware that the samples require that the soft-delete feature be enabled. Our template above will enable this feature automatically, but it is possible to enable it manually using the Azure CLI. See [this page](kvsoftdelete) for more information. + +Samples retrieve credentials to access the Key Vault from environment variables. Alternatively, edit the source code to include the appropriate credentials. See each individual sample for details on which environment variables/credentials it requires to function. + +Adapting the samples to run in the browser may require some additional consideration. For details, please see the [package README][package]. + +## Setup + +To run the samples using the published version of the package: + +1. Install the dependencies using `npm`: + +```bash +npm install +``` + +2. Compile the samples + +```bash +npm run build +``` + +3. Edit the file `sample.env`, adding the correct credentials to access the Azure service and run the samples. Then rename the file from `sample.env` to just `.env`. The sample programs will read this file automatically. + +4. Run whichever samples you like (note that some samples may require additional setup, see the table above): + +```bash +node dist/helloWorld.js +``` + +Alternatively, run a single sample with the correct environment variables set (step 3 is not required if you do this), for example (cross-platform): + +```bash +npx cross-env KEYVAULT_NAME="" AZURE_TENANT_ID="" AZURE_CLIENT_ID="" AZURE_CLIENT_SECRET="" node dist/helloWorld.js +``` + +## Next Steps + +Take a look at our [API Documentation][apiref] for more information about the APIs that are available in the clients. + +[backupandrestore]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keyss/samples/typescript/src/backupAndRestore.ts +[deleteandrecover]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keyss/samples/typescript/src/deleteAndRecover.ts +[helloworld]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keyss/samples/typescript/src/helloWorld.ts +[listoperations]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-keyss/samples/typescript/src/listOperations.ts +[apiref]: https://docs.microsoft.com/javascript/api/@azure/keyvault-secrets +[azkeyvault]: https://docs.microsoft.com/azure/key-vault/quick-create-portal +[kvsoftdelete]: https://docs.microsoft.com/azure/key-vault/key-vault-soft-delete-cli +[freesub]: https://azure.microsoft.com/free/ +[package]: https://github.com/Azure/azure-sdk-for-js/tree/master/sdk/keyvault/keyvault-secrets/README.md +[typescript]: https://www.typescriptlang.org/docs/home.html diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/package.json b/sdk/keyvault/keyvault-secrets/samples/typescript/package.json new file mode 100644 index 000000000000..f5064f922019 --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/package.json @@ -0,0 +1,41 @@ +{ + "name": "azure-keyvault-secrets-samples-ts", + "private": true, + "version": "0.1.0", + "description": "Azure Key Vault Secrets client library samples for TypeScript", + "engine": { + "node": ">=8.0.0" + }, + "scripts": { + "build": "tsc", + "prebuild": "rimraf dist/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Azure/azure-sdk-for-js.git" + }, + "keywords": [ + "Azure", + "Key Vault", + "Secrets", + "Node.js", + "TypeScript" + ], + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Azure/azure-sdk-for-js/issues" + }, + "homepage": "https://github.com/Azure/azure-sdk-for-js#readme", + "sideEffects": false, + "dependencies": { + "@azure/identity": "latest", + "@azure/keyvault-secrets": "latest", + "dotenv": "^8.2.0" + }, + "devDependencies": { + "@types/node": "^8.0.0", + "rimraf": "^3.0.0", + "typescript": "~3.6.4" + } +} diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/sample.env b/sdk/keyvault/keyvault-secrets/samples/typescript/sample.env new file mode 100644 index 000000000000..7fc9052cbf41 --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/sample.env @@ -0,0 +1,11 @@ +# The name of the key vault to use in the samples. +# Create a Key Vault in the Azure Portal and enter its name here. +KEYVAULT_NAME= + +# Used to authenticate using Azure AD as a service principal for role-based authentication. +# +# See the documentation for `EnvironmentCredential` at the following link: +# https://docs.microsoft.com/javascript/api/@azure/identity/environmentcredential +AZURE_TENANT_ID= +AZURE_CLIENT_ID= +AZURE_CLIENT_SECRET= diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/backupAndRestore.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/backupAndRestore.ts similarity index 87% rename from sdk/keyvault/keyvault-secrets/samples/typescript/backupAndRestore.ts rename to sdk/keyvault/keyvault-secrets/samples/typescript/src/backupAndRestore.ts index 5c7341b9937f..3181974393e6 100644 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/backupAndRestore.ts +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/src/backupAndRestore.ts @@ -1,7 +1,15 @@ -import { SecretClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + import * as fs from "fs"; + +import { SecretClient } from "@azure/keyvault-secrets"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + function writeFile(filename: string, text: Uint8Array): Promise { return new Promise((resolve, reject) => { fs.writeFile(filename, text, (err) => { @@ -24,7 +32,7 @@ export function delay(t: number, value?: T): Promise { return new Promise((resolve) => setTimeout(() => resolve(value), t)); } -async function main(): Promise { +export async function main(): Promise { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant @@ -35,7 +43,7 @@ async function main(): Promise { const url = `https://${vaultName}.vault.azure.net`; const client = new SecretClient(url, credential); - const secretName = "StorageAccountPassword"; + const secretName = "secretBackupAndRestoreTS"; // Create our secret await client.setSecret(secretName, "XYZ789"); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/deleteAndRecover.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts similarity index 85% rename from sdk/keyvault/keyvault-secrets/samples/typescript/deleteAndRecover.ts rename to sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts index 0d785b3c21a5..820ab2c9928e 100644 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/deleteAndRecover.ts +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts @@ -1,11 +1,18 @@ -import { SecretClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { SecretClient } from "@azure/keyvault-secrets"; import { DefaultAzureCredential } from "@azure/identity"; +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + export function delay(t: number, value?: T): Promise { return new Promise((resolve) => setTimeout(() => resolve(value), t)); } -async function main(): Promise { +export async function main(): Promise { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant @@ -16,8 +23,8 @@ async function main(): Promise { const url = `https://${vaultName}.vault.azure.net`; const client = new SecretClient(url, credential); - const bankAccountSecretName = "BankAccountPassword11"; - const storageAccountSecretName = "StorageAccountPassword11"; + const bankAccountSecretName = "secretDeleteAndRecoverTS1"; + const storageAccountSecretName = "secretDeleteAndRecoverTS2"; // Create our secrets console.log("Creating our secrets"); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/helloWorld.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts similarity index 81% rename from sdk/keyvault/keyvault-secrets/samples/typescript/helloWorld.ts rename to sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts index 4b3083eef722..0e8679dad6b3 100644 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/helloWorld.ts +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts @@ -1,7 +1,14 @@ -import { SecretClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { SecretClient } from "@azure/keyvault-secrets"; import { DefaultAzureCredential } from "@azure/identity"; -async function main(): Promise { +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + +export async function main(): Promise { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant @@ -14,7 +21,7 @@ async function main(): Promise { const client = new SecretClient(url, credential); // Create a secret - const secretName = "MySecretName"; + const secretName = "secretHelloWorldTS"; const result = await client.setSecret(secretName, "MySecretValue"); console.log("result: ", result); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/listOperations.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts similarity index 75% rename from sdk/keyvault/keyvault-secrets/samples/typescript/listOperations.ts rename to sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts index 808ea0491bc6..552e3ec67af2 100644 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/listOperations.ts +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts @@ -1,7 +1,14 @@ -import { SecretClient } from "../../src"; +// Copyright (c) Microsoft corporation. +// Licensed under the MIT license. + +import { SecretClient } from "@azure/keyvault-secrets"; import { DefaultAzureCredential } from "@azure/identity"; -async function main(): Promise { +// Load the .env file if it exists +import * as dotenv from "dotenv"; +dotenv.config({ path: "../.env" }); + +export async function main(): Promise { // DefaultAzureCredential expects the following three environment variables: // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant @@ -12,8 +19,8 @@ async function main(): Promise { const url = `https://${vaultName}.vault.azure.net`; const client = new SecretClient(url, credential); - const bankAccountSecretName = "BankAccountPassword15"; - const storageAccountSecretName = "StorageAccountPassword15"; + const bankAccountSecretName = "secretListOperations1"; + const storageAccountSecretName = "secretListOperations2"; // Create our secrets await client.setSecret(bankAccountSecretName, "ABC123"); @@ -39,9 +46,13 @@ async function main(): Promise { await client.setSecret(bankAccountSecretName, "ABC567"); // List the versions of BankAccountPassword - for await (const secretProperties of client.listPropertiesOfSecretVersions(bankAccountSecretName)) { - const secret = await client.getSecret(secretProperties.name); - console.log("secret version: ", secret); + for await (const secretProperties of client.listPropertiesOfSecretVersions( + bankAccountSecretName + )) { + if (secretProperties.enabled) { + const secret = await client.getSecret(secretProperties.name); + console.log("secret version: ", secret); + } } await client.beginDeleteSecret(bankAccountSecretName); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/tsconfig.json b/sdk/keyvault/keyvault-secrets/samples/typescript/tsconfig.json new file mode 100644 index 000000000000..4332663bf7b7 --- /dev/null +++ b/sdk/keyvault/keyvault-secrets/samples/typescript/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "node", + + "lib": ["dom", "dom.iterable", "esnext.asynciterable"], + + "allowSyntheticDefaultImports": true, + + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**.ts"], + "exclude": ["node_modules"] +}