API d'extension SecretStorage VSCode

Il existe plusieurs façons de stocker les préférences utilisateur dans VSCode. Avant l'arrivée de la version 1.53.0, les informations confidentielles devaient être stockées dans des objets Memento dans workspaceState et globalState ou, par exemple, keytar . Et stocker les mots de passe avec des jetons dans un fichier de configuration standard ou utiliser des variables d'environnement n'était pas la meilleure idée, car ces données pouvaient être lues et mises en cache par d'autres extensions.





Dans l'article, nous examinerons les moyens de lire des données à partir de settings.json



et environment variables



. Ensuite, nous créerons une classe avec des fonctionnalités minimales chargées de stocker et de servir les clés avec des valeurs de VSCode SecretStorage.





Nous nommerons le projet de manière conventionnelle fancycolor



. Le processus d'initialisation du projet est détaillé dans la documentation des extensions VSCode , alors commençons tout de suite.





settings.json

Tous les paramètres de toutes les extensions VSCode sont stockés dans un fichier commun settings.json



et sont donc accessibles à partir de n'importe quelle extension. Par exemple, à partir de notre application, fancycolor



nous pouvons facilement lire une liste de tous les hôtes et de leurs plates-formes correspondantes à partir de notre configuration d'une autre application populaire SSH - Remote



.





const configurationWorkspace = workspace.getConfiguration()
const sshRemotePlatform: string | undefined = configurationWorkspace.get(
  "remote.SSH.remotePlatform"
)
console.log(sshRemotePlatform)
      
      



Ce code listera votre configuration pour l'extension SSH - Remote



.





Proxy {ubuntu: 'linux', home: 'linux', raspberry: 'linux'}
      
      



Variables d'environnement

VSCode . .bashrc



Linux User.Environment



Windows process.env



.





/home/ubuntu/.env



ACCESS_TOKEN_ENV



.bashrc



.





echo 'export ACCESS_TOKEN_ENV="d8aba3b2-fda0-414a-b867-4798b7892bb4"' >> /home/ubuntu/.env
echo "source /home/ubuntu/.env" >> /home/ubuntu/.bashrc
      
      



Windows Powershell.





[System.Environment]::SetEnvironmentVariable('ACCESS_TOKEN_ENV', 'd8aba3b2-fda0-414a-b867-4798b7892bb4', [System.EnvironmentVariableTarget]::User)
      
      



VSCode fancycolor



extension.





import * as process from "process"
export const accessTokenEnv = process.env["ACCESS_TOKEN_ENV"]
console.log(accessTokenEnv)
      
      



.





d8aba3b2-fda0-414a-b867-4798b7892bb4
      
      



SecretStorage

, , VSCode. AuthSettings



, fancycolor_token



, :





  • init



    SecretStorage





  • getter instance







  • storeAuthData



    SecretStorage





  • getAuthData



    SecretStorage





import { ExtensionContext, SecretStorage } from "vscode"

export default class AuthSettings {
	private static _instance: AuthSettings

	constructor(private secretStorage: SecretStorage) {}

	static init(context: ExtensionContext): void {
		/*
		Create instance of new AuthSettings.
		*/
		AuthSettings._instance = new AuthSettings(context.secrets)
	}

	static get instance(): AuthSettings {
		/*
		Getter of our AuthSettings existing instance.
		*/
		return AuthSettings._instance
	}

	async storeAuthData(token?: string): Promise<void> {
		/*
		Update values in bugout_auth secret storage.
		*/
		if (token) {
			this.secretStorage.store("fancycolor_token", token)
		}
	}

	async getAuthData(): Promise<string | undefined> {
		/*
		Retrieve data from secret storage.
		*/
		return await this.secretStorage.get("fancycolor_token")
	}
}
      
      



La extension.ts



fonctionnalité d'écriture vous permet d'ajouter et de récupérer le jeton à l'aide des commandes de la palette de commandes.





import * as vscode from "vscode"

import AuthSettings from "./settings"

export function activate(context: vscode.ExtensionContext) {
	// Initialize and get current instance of our Secret Storage
	AuthSettings.init(context)
	const settings = AuthSettings.instance
	
	// Register commands to save and retrieve token
	vscode.commands.registerCommand("fancycolor.setToken", async () => {
		const tokenInput = await vscode.window.showInputBox()
		await settings.storeAuthData(tokenInput)
	})
	vscode.commands.registerCommand("fancycolor.getToken", async () => {
		const tokenOutput = await settings.getAuthData()
		console.log(tokenOutput)
	})
}

export function deactivate() {}
      
      



Il ne reste plus qu'à package.json



enregistrer les commandes fancycolor.setToken



et fancycolor.getToken



. Plus tard, lorsque nous travaillerons avec VSCode SecretStorage, nous pourrons nous référer exclusivement au SecretStorage spécifique créé pour notre application, qui se verra attribuer le nôtre _id: 'undefined_publisher.fancycolor'



.








All Articles