はじめに
pnpm installの際にkeytarエラーが発生したことがきっかけとなり、本記事を書くことなりました。
個人的なモヤモヤ解消したいがために、keytarについて調査したことを簡単に以下まとめています。
Keytarとは何か?
一言で言うと「システムキーチェーンを扱うためのNode.jsモジュール」です。
キーチェーンとは?(AIに聞いてみました)
パスワードや暗号化キーなどの機密情報を安全に保管するための、ソフトウェアまたはハードウェアの仕組みです。 オペレーティングシステムやアプリケーションによって実装方法は異なりますが、共通の目的は、ユーザーが個々のパスワードを覚える必要性を減らし、セキュリティを向上させることです。
macOS、Linux、Windowsといった様々なOSのキーチェーンにアクセスするためのクロスプラットフォームのNode.jsモジュールです。 これにより、アプリケーションはプラットフォーム固有のキーチェーンAPIを意識することなく、安全にパスワードやAPIキーなどの機密情報を保存、取得、削除できます。
各OSでは以下のキーチェーンシステムを利用している模様です。
- macOS: Keychain
- Linux: Secret Service API/libsecret
- Windows: Credential Vault
Keytarのインストール
npm install keytar
または
yarn add keytar
インストール後、keytarをインポートして使用できます。
const keytar = require('keytar');
Linux環境では、libsecretが必要になる場合があります。ディストリビューションによってインストール方法は異なりますが、Debian/UbuntuとRed Hat系を例として記載しておきます。
Debian/Ubuntu
sudo apt-get install libsecret-1-dev
Red Hat系
sudo yum install libsecret-devel
Arch Linux
sudo pacman -S libsecret
主要な関数
keytarは、パスワードの保存、取得、削除、検索を行うための主要な非同期関数を提供します。 全ての関数はPromiseを返し、エラーが発生した場合はrejectされます。
getPassword(service, account)
指定されたserviceとaccountに対応するパスワードを取得します。パスワードが見つからない場合はnullを返します。
setPassword(service, account, password)
指定されたserviceとaccountにパスワードを保存します。既存のエントリがあれば更新し、なければ新規に作成します。
deletePassword(service, account)
指定されたserviceとaccountに対応するパスワードを削除します。パスワードが見つからない場合はfalseを返します。
findCredentials(service)
指定されたserviceに対応する全てのアカウントとパスワードを取得します。配列[{ account: 'foo', password: 'bar' }]として返します。
findPassword(service)
指定されたserviceに対応するパスワードを取得します。アカウントは不要な場合に便利です。パスワードが見つからない場合はnullを返します。
使用例
以下、keytarの基本的な使用方法を簡単に書いてみました。
内容としてはhoge-appというサービスとhoge-userというアカウントにパスワードを保存し、取得後に削除しています。
const keytar = require('keytar');
async function main() {
const service = 'hoge-app';
const account = 'hoge-user';
const password = 'hoge-secret-password';
try {
await keytar.setPassword(service, account, password);
console.log('パスワードが保存されました。');
const retrievedPassword = await keytar.getPassword(service, account);
console.log('取得したパスワード:', retrievedPassword);
await keytar.deletePassword(service, account);
console.log('パスワードが削除されました。');
} catch (error) {
console.error('エラーが発生しました:', error);
}
}
main();
まとめ
- keytarは、Node.jsアプリケーションでシステムのキーチェーンを安全に操作するツール
- クロスプラットフォームの互換性とシンプルなAPIにより、開発者は簡単に機密情報を管理できる
- Linux環境ではlibsecretが必要になるケースがあることにも注意したい