Ada beberapa cara untuk menyimpan preferensi pengguna di VSCode. Sebelum kedatangan versi 1.53.0, informasi rahasia harus disimpan di objek Memento di workspaceState dan globalState atau, misalnya, keytar . Dan menyimpan kata sandi dengan token dalam file konfigurasi standar atau menggunakan variabel lingkungan bukanlah ide terbaik, karena data ini dapat dibaca dan di-cache oleh ekstensi lain.
Dalam artikel ini, kita akan melihat cara membaca data dari settings.json
dan environment variables
. Dan kemudian kita akan membuat kelas dengan fungsionalitas minimal yang bertanggung jawab untuk menyimpan dan menyajikan kunci dengan nilai dari VSCode SecretStorage.
Kami akan memberi nama proyek secara konvensional fancycolor
. Proses inisialisasi proyek dirinci dalam dokumentasi VSCode Extensions , jadi mari kita mulai sekarang juga.
settings.json
Semua pengaturan dari semua ekstensi VSCode disimpan dalam file umum settings.json
dan oleh karena itu dapat diakses dari ekstensi apa pun. Misalnya, dari aplikasi fancycolor
kita , kita dapat dengan mudah membaca daftar semua host dan platformnya yang sesuai dari konfigurasi kita tentang aplikasi populer lainnya SSH - Remote
.
const configurationWorkspace = workspace.getConfiguration()
const sshRemotePlatform: string | undefined = configurationWorkspace.get(
"remote.SSH.remotePlatform"
)
console.log(sshRemotePlatform)
Kode ini akan mencantumkan konfigurasi Anda untuk ekstensi SSH - Remote
.
Proxy {ubuntu: 'linux', home: 'linux', raspberry: 'linux'}
variabel lingkungan
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")
}
}
The extension.ts
fungsi write memungkinkan Anda untuk menambahkan dan mengambil token menggunakan perintah di Command Palette.
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() {}
Tetap hanya untuk package.json
mendaftarkan perintah fancycolor.setToken
dan fancycolor.getToken
. Nanti, saat bekerja dengan VSCode SecretStorage, kita akan dapat merujuk secara eksklusif ke SecretStorage spesifik yang dibuat untuk aplikasi kita, yang akan diberikan milik kita sendiri _id: 'undefined_publisher.fancycolor'
.