API de extensión SecretStorage VSCode

Hay varias formas de almacenar las preferencias del usuario en VSCode. Antes de la llegada de la versión 1.53.0, la información confidencial tenía que almacenarse en objetos Memento en workspaceState y globalState o, por ejemplo, keytar . Y almacenar contraseñas con tokens en un archivo de configuración estándar o usar variables de entorno no era la mejor idea, ya que estos datos podían ser leídos y almacenados en caché por otras extensiones.





En el artículo, veremos formas de leer datos de settings.json



y environment variables



. Y luego crearemos una clase con una funcionalidad mínima responsable de almacenar y entregar claves con valores de VSCode SecretStorage.





Denominaremos convencionalmente el proyecto fancycolor



. El proceso de inicialización del proyecto se detalla en la documentación de Extensiones VSCode , así que comencemos de inmediato.





settings.json

Todas las configuraciones de todas las extensiones de VSCode se almacenan en un archivo común settings.json



y, por lo tanto, se puede acceder a ellas desde cualquier extensión. Por ejemplo, desde nuestra aplicación, fancycolor



podemos leer fácilmente una lista de todos los hosts y sus plataformas correspondientes desde nuestra configuración de otra aplicación popular SSH - Remote



.





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



Este código enumerará su configuración para la extensión SSH - Remote



.





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



Variables de entorno

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



funcionalidad de escritura le permite agregar y recuperar el token usando los comandos en la paleta de comandos.





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() {}
      
      



Solo queda package.json



registrar los comandos fancycolor.setToken



y fancycolor.getToken



. Posteriormente, cuando trabajemos con VSCode SecretStorage, podremos referirnos exclusivamente al SecretStorage específico creado para nuestra aplicación, al que se le asignará el nuestro _id: 'undefined_publisher.fancycolor'



.








All Articles