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'
.