From ba710dd7a6a5f69f1cb125644f3e65c272ca1408 Mon Sep 17 00:00:00 2001 From: Will Temple Date: Thu, 27 May 2021 12:15:03 -0700 Subject: [PATCH] [keyvault-secrets] Remove duplicated samples --- .../samples/javascript/README.md | 74 ---------------- .../samples/javascript/backupAndRestore.js | 81 ----------------- .../samples/javascript/deleteAndRecover.js | 83 ------------------ .../samples/javascript/helloWorld.js | 44 ---------- .../samples/javascript/listOperations.js | 85 ------------------ .../samples/javascript/package.json | 35 -------- .../samples/javascript/purgeAllSecrets.js | 57 ------------ .../samples/javascript/sample.env | 11 --- .../keyvault-secrets/samples/tsconfig.json | 9 -- .../samples/typescript/README.md | 87 ------------------- .../samples/typescript/package.json | 41 --------- .../samples/typescript/sample.env | 11 --- .../typescript/src/backupAndRestore.ts | 83 ------------------ .../typescript/src/deleteAndRecover.ts | 75 ---------------- .../samples/typescript/src/helloWorld.ts | 51 ----------- .../samples/typescript/src/listOperations.ts | 70 --------------- .../samples/typescript/src/purgeAllSecrets.ts | 46 ---------- .../samples/typescript/tsconfig.json | 15 ---- 18 files changed, 958 deletions(-) delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/README.md delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/backupAndRestore.js delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/package.json delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/purgeAllSecrets.js delete mode 100644 sdk/keyvault/keyvault-secrets/samples/javascript/sample.env delete mode 100644 sdk/keyvault/keyvault-secrets/samples/tsconfig.json delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/README.md delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/package.json delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/sample.env delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/src/backupAndRestore.ts delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/src/purgeAllSecrets.ts delete mode 100644 sdk/keyvault/keyvault-secrets/samples/typescript/tsconfig.json diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/README.md b/sdk/keyvault/keyvault-secrets/samples/javascript/README.md deleted file mode 100644 index d17ebb34c1f8..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/README.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -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/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 | -| [purgeAllSecrets.js][purgeallsecrets] | purges all the secrets of a Key Vault (useful for repeated tests) | - -## 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%2Ftest-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_URI="" 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/blob/master/sdk/keyvault/keyvault-secrets/samples/javascript/backupAndRestore.js -[deleteandrecover]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js -[helloworld]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js -[listoperations]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js -[purgeallsecrets]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/javascript/purgeAllSecrets.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/blob/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 deleted file mode 100644 index c0f75a6d2b11..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/backupAndRestore.js +++ /dev/null @@ -1,81 +0,0 @@ -// 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) => { - if (err) reject(err); - else resolve(); - }); - }); -} - -function readFile(filename) { - return new Promise((resolve, reject) => { - fs.readFile(filename, (err, data) => { - if (err) reject(err); - else resolve(data); - }); - }); -} - -function delay(t, value) { - return new Promise((resolve) => setTimeout(() => resolve(value), t)); -} - -async function main() { - // 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 - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - const uniqueString = new Date().getTime(); - const secretName = `secret${uniqueString}`; - - // Create our secret - await client.setSecret(secretName, "XYZ789"); - - // Backup secret - const backupResult = await client.backupSecret(secretName); - - // Write the backup to a file - await writeFile("secret_backup.dat", backupResult); - - // Delete the secret - console.log("about to delete"); - let deletePoller = await client.beginDeleteSecret(secretName); - await deletePoller.pollUntilDone(); - - // Purge the deleted secret - console.log("about to purge"); - await client.purgeDeletedSecret(secretName); - await delay(30000); - - // Read our backup from a file - console.log("about to restore secret"); - const backupContents = await readFile("secret_backup.dat"); - - // Restore the secret - const result = await client.restoreSecretBackup(backupContents); - console.log("Restored secret: ", result); - - // If we don't want to purge the secret later, we don't need to wait until this finishes - await client.beginDeleteSecret(secretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js b/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js deleted file mode 100644 index a8aae119cd5b..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/deleteAndRecover.js +++ /dev/null @@ -1,83 +0,0 @@ -// 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)); -} - -async function main() { - // 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 - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - const uniqueString = new Date().getTime(); - const bankAccountSecretName = `bankSecret${uniqueString}`; - const storageAccountSecretName = `storageSecret${uniqueString}`; - - // Create our secrets - console.log("Creating our secrets"); - await client.setSecret(bankAccountSecretName, "ABC123"); - await client.setSecret(storageAccountSecretName, "XYZ789"); - await delay(5000); - - // Oops, what happens if we delete the wrong one? - console.log("Deleting secret: ", bankAccountSecretName); - let deletePoller = await client.beginDeleteSecret(bankAccountSecretName); - await deletePoller.pollUntilDone(); - - console.log("Showing deleted secrets"); - let listDeletedSecrets = client.listDeletedSecrets(); - while (true) { - let { done, value } = await listDeletedSecrets.next(); - if (done) { - break; - } - console.log(value); - } - - // That's okay, it's not gone until it's fully deleted (purged) - // Note: this only works if soft-delete is enabled on your vault - console.log("Recovering secret"); - const recoverPoller = await client.beginRecoverDeletedSecret(bankAccountSecretName); - const recoveredSecret = await recoverPoller.pollUntilDone(); - console.log(recoveredSecret); - - // To actually delete it, we delete and then purge the secret - // Delete the secret - console.log("about to delete"); - deletePoller = await client.beginDeleteSecret(bankAccountSecretName); - await deletePoller.pollUntilDone(); - - // Purge the deleted secret - console.log("about to purge"); - await client.purgeDeletedSecret(bankAccountSecretName); - await delay(30000); - - let listDeletedSecrets2 = client.listDeletedSecrets(); - while (true) { - let { done, value } = await listDeletedSecrets2.next(); - if (done) { - break; - } - console.log(value); - } - - // If we don't want to purge the secret later, we don't need to wait until this finishes - await client.beginDeleteSecret(storageAccountSecretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js b/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js deleted file mode 100644 index a29b2e501e2c..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/helloWorld.js +++ /dev/null @@ -1,44 +0,0 @@ -// 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 - // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - // Create a secret - const uniqueString = new Date().getTime(); - const secretName = `secret${uniqueString}`; - const result = await client.setSecret(secretName, "MySecretValue"); - console.log("result: ", result); - - // Read the secret we created - const secret = await client.getSecret(secretName); - console.log("secret: ", secret); - - // Update the secret with different attributes - const updatedSecret = await client.updateSecretProperties(secretName, result.properties.version, { - enabled: false - }); - console.log("updated secret: ", updatedSecret); - - // Delete the secret - // If we don't want to purge the secret later, we don't need to wait until this finishes - await client.beginDeleteSecret(secretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js b/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js deleted file mode 100644 index a79dfd3c966a..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/listOperations.js +++ /dev/null @@ -1,85 +0,0 @@ -// 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 - // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - const uniqueString = new Date().getTime(); - const bankAccountSecretName = `bankSecret${uniqueString}`; - const storageAccountSecretName = `storageSecret${uniqueString}`; - - // Create our secrets - await client.setSecret(bankAccountSecretName, "ABC123"); - await client.setSecret(storageAccountSecretName, "XYZ789"); - - // List the secrets we have, by page - console.log("Listing secrets by page"); - let listPropertiesOfSecrets = client.listPropertiesOfSecrets().byPage({ maxPageSize: 2 }); - while (true) { - let { done, value } = await listPropertiesOfSecrets.next(); - if (done) { - break; - } - - for (const secretProperties of value) { - if (secretProperties.enabled) { - const secret = await client.getSecret(secretProperties.name); - console.log("secret: ", secret); - } - } - console.log("--page--"); - } - - // List the secrets we have, all at once - console.log("Listing secrets all at once"); - listPropertiesOfSecrets = client.listPropertiesOfSecrets(); - while (true) { - let { done, value } = await listPropertiesOfSecrets.next(); - if (done) { - break; - } - - if (value.enabled) { - const secret = await client.getSecret(value.name); - console.log("secret: ", secret); - } - } - - await client.setSecret(bankAccountSecretName, "ABC567"); - - // List the versions of BankAccountPassword - console.log("Listing all versions of a secret"); - let listPropertiesOfSecretVersions = client.listPropertiesOfSecretVersions(bankAccountSecretName); - while (true) { - let { done, value } = await listPropertiesOfSecretVersions.next(); - if (done) { - break; - } - - if (value.enabled) { - const secret = await client.getSecret(value.name); - console.log("version: ", secret); - } - } - - await client.beginDeleteSecret(bankAccountSecretName); - await client.beginDeleteSecret(storageAccountSecretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/package.json b/sdk/keyvault/keyvault-secrets/samples/javascript/package.json deleted file mode 100644 index 4c0fb370ab8d..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "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/purgeAllSecrets.js b/sdk/keyvault/keyvault-secrets/samples/javascript/purgeAllSecrets.js deleted file mode 100644 index 7495f9bd4ef1..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/purgeAllSecrets.js +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// purgeAllSecrets.js -// helps remove any existing resources from the KeyVault. - -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 - // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - let listPropertiesOfSecrets = client.listPropertiesOfSecrets(); - while (true) { - let { done, value } = await listPropertiesOfSecrets.next(); - if (done) { - break; - } - - try { - const poller = await client.beginDeleteSecret(value.name); - await poller.pollUntilDone(); - } catch(e) { - // We don't care about the error because this script is intended to just clean up the KeyVault. - } -} - - let listDeletedSecrets = client.listDeletedSecrets(); - while (true) { - let { done, value } = await listDeletedSecrets.next(); - if (done) { - break; - } - - try { - // This will take a while. - await client.purgeDeletedSecret(deletedSecret.name); - } catch(e) { - // We don't care about the error because this script is intended to just clean up the KeyVault. - } - } -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/javascript/sample.env b/sdk/keyvault/keyvault-secrets/samples/javascript/sample.env deleted file mode 100644 index 423b054105ca..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/javascript/sample.env +++ /dev/null @@ -1,11 +0,0 @@ -# The name of the key vault to use in the samples. -# Create a Key Vault in the Azure Portal and enter its URI (e.g. https://mytest.vault.azure.net/) here. -KEYVAULT_URI= - -# 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 deleted file mode 100644 index 3a37abdb0902..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../tsconfig.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 deleted file mode 100644 index 5e754f8672d3..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/README.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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/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 | -| [purgeAllSecrets.ts][purgeallsecrets] | purges all the secrets of a Key Vault (useful for repeated tests) | - -## 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%2Ftest-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_URI="" 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/blob/master/sdk/keyvault/keyvault-secrets/samples/typescript/src/backupAndRestore.ts -[deleteandrecover]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts -[helloworld]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts -[listoperations]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts -[purgeallsecrets]: https://github.com/Azure/azure-sdk-for-js/blob/master/sdk/keyvault/keyvault-secrets/samples/typescript/src/purgeAllSecrets.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/blob/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 deleted file mode 100644 index f5064f922019..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "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 deleted file mode 100644 index 423b054105ca..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/sample.env +++ /dev/null @@ -1,11 +0,0 @@ -# The name of the key vault to use in the samples. -# Create a Key Vault in the Azure Portal and enter its URI (e.g. https://mytest.vault.azure.net/) here. -KEYVAULT_URI= - -# 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/src/backupAndRestore.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/backupAndRestore.ts deleted file mode 100644 index ac368f1db847..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/src/backupAndRestore.ts +++ /dev/null @@ -1,83 +0,0 @@ -// 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(); - -function writeFile(filename: string, text: Uint8Array): Promise { - return new Promise((resolve, reject) => { - fs.writeFile(filename, text, (err) => { - if (err) reject(err); - else resolve(); - }); - }); -} - -function readFile(filename: string): Promise { - return new Promise((resolve, reject) => { - fs.readFile(filename, (err, data) => { - if (err) reject(err); - else resolve(data); - }); - }); -} - -export function delay(t: number, value?: T): Promise { - return new Promise((resolve) => setTimeout(() => resolve(value), t)); -} - -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 - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - const uniqueString = new Date().getTime(); - const secretName = `secret${uniqueString}`; - - // Create our secret - await client.setSecret(secretName, "XYZ789"); - - // Backup secret - const backupResult = await client.backupSecret(secretName); - - // Write the backup to a file - await writeFile("secret_backup.dat", backupResult!); - - // Delete the secret - console.log("about to delete"); - let deletePoller = await client.beginDeleteSecret(secretName); - await deletePoller.pollUntilDone(); - - // Purge the deleted secret - console.log("about to purge"); - await client.purgeDeletedSecret(secretName); - await delay(30000); - - // Read our backup from a file - console.log("about to restore secret"); - const backupContents = await readFile("secret_backup.dat"); - - // Restore the secret - const result = await client.restoreSecretBackup(backupContents); - console.log("Restored secret: ", result); - - // If we don't want to purge the secret later, we don't need to wait until this finishes - await client.beginDeleteSecret(secretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts deleted file mode 100644 index 89be81547bef..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/src/deleteAndRecover.ts +++ /dev/null @@ -1,75 +0,0 @@ -// 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(); - -export function delay(t: number, value?: T): Promise { - return new Promise((resolve) => setTimeout(() => resolve(value), t)); -} - -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 - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - const uniqueString = new Date().getTime(); - const bankAccountSecretName = `bankSecret${uniqueString}`; - const storageAccountSecretName = `storageSecret${uniqueString}`; - - // Create our secrets - console.log("Creating our secrets"); - await client.setSecret(bankAccountSecretName, "ABC123"); - await client.setSecret(storageAccountSecretName, "XYZ789"); - await delay(5000); - - // Oops, what happens if we delete the wrong one? - console.log("Deleting secret: ", bankAccountSecretName); - let deletePoller = await client.beginDeleteSecret(bankAccountSecretName); - await deletePoller.pollUntilDone(); - - console.log("Showing deleted secrets"); - for await (const deletedSecret of client.listDeletedSecrets()) { - console.log(deletedSecret); - } - - // That's okay, it's not gone until it's fully deleted (purged) - // Note: this only works if soft-delete is enabled on your vault - console.log("Recovering secret"); - const recoverPoller = await client.beginRecoverDeletedSecret(bankAccountSecretName); - const recoveredSecret = await recoverPoller.pollUntilDone(); - console.log(recoveredSecret); - - // To actually delete it, we delete and then purge the secret - // Delete the secret - console.log("about to delete"); - deletePoller = await client.beginDeleteSecret(bankAccountSecretName); - await deletePoller.pollUntilDone(); - - // Purge the deleted secret - console.log("about to purge"); - await client.purgeDeletedSecret(bankAccountSecretName); - await delay(30000); - - for await (const deletedSecret of client.listDeletedSecrets()) { - console.log(deletedSecret); - } - - // If we don't want to purge the secret later, we don't need to wait until this finishes - await client.beginDeleteSecret(storageAccountSecretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts deleted file mode 100644 index a772a28415b0..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/src/helloWorld.ts +++ /dev/null @@ -1,51 +0,0 @@ -// 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(); - -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 - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - - const url = process.env["KEYVAULT_URI"] || ""; - - const client = new SecretClient(url, credential); - - // Create a secret - const uniqueString = new Date().getTime(); - const secretName = `secret${uniqueString}`; - const result = await client.setSecret(secretName, "MySecretValue"); - console.log("result: ", result); - - // Read the secret we created - const secret = await client.getSecret(secretName); - console.log("secret: ", secret); - - // Update the secret with different attributes - const updatedSecret = await client.updateSecretProperties( - secretName, - result.properties.version!, - { - enabled: false, - } - ); - console.log("updated secret: ", updatedSecret); - - // Delete the secret - // If we don't want to purge the secret later, we don't need to wait until this finishes - await client.beginDeleteSecret(secretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts deleted file mode 100644 index 7b740f558bef..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/src/listOperations.ts +++ /dev/null @@ -1,70 +0,0 @@ -// 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(); - -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 - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - const uniqueString = new Date().getTime(); - const bankAccountSecretName = `bankSecret${uniqueString}`; - const storageAccountSecretName = `storageSecret${uniqueString}`; - - // Create our secrets - await client.setSecret(bankAccountSecretName, "ABC123"); - await client.setSecret(storageAccountSecretName, "XYZ789"); - - // List the secrets we have, by page - console.log("Listing secrets by page"); - for await (const page of client.listPropertiesOfSecrets().byPage({ maxPageSize: 2 })) { - for (const secretProperties of page) { - if (secretProperties.enabled) { - const secret = await client.getSecret(secretProperties.name); - console.log("secret: ", secret); - } - } - console.log("--page--"); - } - - // List the secrets we have, all at once - console.log("Listing secrets all at once"); - for await (const secretProperties of client.listPropertiesOfSecrets()) { - if (secretProperties.enabled) { - const secret = await client.getSecret(secretProperties.name); - console.log("secret: ", secret); - } - } - - await client.setSecret(bankAccountSecretName, "ABC567"); - - // List the versions of BankAccountPassword - 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); - await client.beginDeleteSecret(storageAccountSecretName); -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/src/purgeAllSecrets.ts b/sdk/keyvault/keyvault-secrets/samples/typescript/src/purgeAllSecrets.ts deleted file mode 100644 index 79c907995f31..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/src/purgeAllSecrets.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -// purgeAllSecrets.ts -// helps remove any existing resources from the KeyVault. - -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(); - -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 - // - AZURE_CLIENT_SECRET: The client secret for the registered application - const credential = new DefaultAzureCredential(); - - const url = process.env["KEYVAULT_URI"] || ""; - const client = new SecretClient(url, credential); - - for await (const properties of client.listPropertiesOfSecrets()) { - try { - const poller = await client.beginDeleteSecret(properties.name); - await poller.pollUntilDone(); - } catch (e) { - // We don't care about the error because this script is intended to just clean up the KeyVault. - } - } - for await (const deletedSecret of client.listDeletedSecrets()) { - try { - // This will take a while. - await client.purgeDeletedSecret(deletedSecret.name); - } catch (e) { - // We don't care about the error because this script is intended to just clean up the KeyVault. - } - } -} - -main().catch((err) => { - console.log("error code: ", err.code); - console.log("error message: ", err.message); - console.log("error stack: ", err.stack); -}); diff --git a/sdk/keyvault/keyvault-secrets/samples/typescript/tsconfig.json b/sdk/keyvault/keyvault-secrets/samples/typescript/tsconfig.json deleted file mode 100644 index 4332663bf7b7..000000000000 --- a/sdk/keyvault/keyvault-secrets/samples/typescript/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "moduleResolution": "node", - - "lib": ["dom", "dom.iterable", "esnext.asynciterable"], - - "allowSyntheticDefaultImports": true, - - "outDir": "dist", - "rootDir": "src" - }, - "include": ["src/**.ts"], - "exclude": ["node_modules"] -}