Bitwarden CLIのログインを簡単にするPowerShellスクリプト



## Bitwarden CLI

>Bitwarden（ビットウォーデン）は、暗号化された保管庫にウェブサイトの資格情報などを保存する、自由かつオープンソースのパスワードマネージャーである。クラウドでホストされるサービスと、オンプレミスでセルフホストする機能が提供されている。Webインターフェイス、デスクトップアプリ、ブラウザ拡張機能、モバイルアプリ、CLIなど、さまざまなクライアントアプリケーションがある。
(wikipediaより)
https://ja.wikipedia.org/wiki/Bitwarden

Bitwordenはオープンソースのパスワードマネージャで、WebサイトのログインID以外にも様々な資格情報の管理に利用できます。
Bitwarden CLIは、Bitwardenの資格情報の登録や閲覧をコマンドラインベースで行うためのツールです。

### インストール方法
1. 下記URLからダウンロードして、任意のフォルダに解凍します。
  https://bitwarden.com/ja-JP/help/cli/#download-and-install
2. 解凍したフォルダの中には"bw.exe"のみが入っています。このフォルダへのパスを環境変数のPathへ登録しておきます。

### Bitwarden CLIの使い方

### Login
まずはBitwardenにログインする必要がありますが、少々面倒です。

```shell
> bw login
```

loginコマンドを実行すると、アカウント情報（Emailアドレス、パスワード、２段階認証コード（設定している場合））を聞かれるので入力します。

```shell
> bw login
? Email address: user@sample.com
? Master password: [input is hidden]
? Two-step login code: 433362
```

ログインに成功すると下記のテキストが表示され、セッションキーを環境変数に設定するよう指示されます。

```shell
You are logged in !

To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex:
$ export BW_SESSION="hYAmUSkIKhjb1....."
> $env:BW_SESSION="hYAmUSkIKhjb1..."
```
そこでメッセージにある、環境変数に設定するコマンドをコピぺして実行します。

```shell
> $env:BW_SESSION="hYAmUSkIKhjb1..."
```

これでようやくBitwarden操作ができるようになります。

```shell
> bw list items
[{"object":"item","id":"09b2e0c3-c806-4860-....."},{...}]

> bw get password Qiita
hogehogefugafuga
```
### Unlock

ログインと同時に保管庫がアンロックされセッションキーが発行されますが、セッションキーには有効期限があり、しばらくすると環境変数に設定したセッションキーは無効となり保管庫がロックされてしまいます。
その場合には、unlockコマンドを使って再度セッションキーを発行する必要があります。

```shell
> bw unlock
```
セッションキーが無効となっただけで、ログイン状態は保たれていますので、ここではパスワードの入力のみとなります。

```shell
> bw unlock
? Master password: [hidden]
Your vault is now unlocked!

To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex:
$ export BW_SESSION="/PC2hfmQBPxmG..."
> $env:BW_SESSION="/PC2hfmQBPxmG..."

You can also pass the session key to any command with the `--session` option. ex:
$ bw list items --session /PC2hfmQBPxmG...
```

ここで表示されたセッションキーを再度、環境変数に設定します。

```shell
> $env:BW_SESSION="/PC2hfmQBPxmG..."
```

ちなみに、セッションが切れた状態でコマンドを実行しようとすると、毎回パスワードの入力を要求されます。

```shell
> bw list items
? Master password: [hidden]
```

## ログインまわりの処理をまとめる

login、unlockまわりの操作をもうちょっと簡素化できないか（特に環境変数に設定するセッションキーをコピペする辺り）という事で、PowerShellの関数を作ってみました。
関数の内容は下記コード内のコメントをご確認ください。

```powershell

<#
    .SYNOPSIS
    bitwarden CLIのセッションを開始します。
    .Description
    bitwarden CLI で保管庫をアンロックし、発行されたセッションキーを環境変数に設定します。
#>
function Start-BwSession {
    # bitwardenのステータスを取得
    $status = bw.exe status | ConvertFrom-Json
    $session = $null
    # 未ログインの場合
    if ($status.status -eq "unauthenticated") {
        Write-Host "bitwardenにloginします"
        $session = bw.exe login
    }
    # ロック状態の場合
    elseif ($status.status -eq "locked") {
        Write-Host "保管庫をUnlockします"
        $session = bw.exe unlock
    }
    # ログイン済みの場合は何もしない

    # login、unlock成功時
    if ($null -ne $session) {
        # login、unlockから帰ってくる文字列から、セッションキーのみを取り出す
        $key = $session`
        | Where-Object { $_.StartsWith("> `$env:BW_SESSION=") } `
        | Foreach-Object { $_.Replace("> `$env:BW_SESSION=", "").Trim('"') }
        # 環境変数にセッションキーを設定する
        $env:BW_SESSION = $key
        Write-Host "セッションキーを環境変数にセットしました"
    }
    Write-Host "準備完了です"
}
```

この関数を、PowerShellのプロファイルに書き込んでおくと、PowerShell起動時に自動で読み込まれるので便利です。
プロファイルの場所は変数 `$profile` で確認できます。

```powershell
> $profile
C:\Users\username\ドキュメント\PowerShell\Microsoft.PowerShell_profile.ps1
```

### 実行例

未ログイン時

```powershell
> Start-BwSession
bitwardenにloginします
? Email address: user@sample.com
? Master password: [hidden]
? Two-step login code: 218397
セッションキーを環境変数にセットしました
準備完了です
```

ログイン済み、保管庫ロック時
```powershell
> Start-BwSession
mac failed.
保管庫をUnlockします
? Master password: [hidden]
セッションキーを環境変数にセットしました
準備完了です
```

ログイン済み、保管庫アンロック済み
```powershell
> Start-BwSession
準備完了です
```