1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

copilot.vimがGitHub認証のOAuthトークンを平文で保存しちゃう問題とその対策

1
Posted at

はじめに

最近サプライチェーンアタックとか物騒なんで、自衛のためにローカルの平文クレデンシャルは撲滅すべきです。

ところでVimでGitHub Copilotを使うには copilot.vim という公式の拡張があるのだけど、copilot.vimで :Copilot setup してブラウザでGitHub Copilot PluginのGtiHub Appsを認証すると、こっそりローカルの ~/.config/github-copilot/apps.jsonoauth_token を平文で保存していることに気づきました。
これはユーザ向けの設定ファイルではないし、copilot.vimのドキュメント読んでも環境変数でトークンを渡す方法とかはなさそうです。困った。

あれこれ調べた結果、現状非公式ではあるものの回避策を見つけたので、Web検索にヒットしやすそうな場所に放流しておきます。

環境

手元の環境は以下のとおりです。

  • copilot.vim: v1.59.0
  • copilot-language-server: v1.408.0

調査

調べたところcopilot.vimにはGitHubの認証処理は実装されておらず、内部的に copilot-language-server を呼び出しています。
copilot-language-serverのソースは公開されておらず、ドキュメントにも言及はありませんが、以下のissueで非公式ではあるものの環境変数 GITHUB_COPILOT_TOKEN または GH_COPILOT_TOKEN 経由でトークンが渡せることが分かりました。

Unofficial support for GITHUB_COPILOT_TOKEN and GH_COPILOT_TOKEN has been implemented in the latest release.

1点注意点として、 gh auth token などで生成したGitHubトークンでは、CopilotのAPIを叩けるOAuthトークンは生成できません。GitHub Copilot PluginのGtiHub Apps認証経由でOAuthトークンを生成する必要があります。

the issue you will run into is that the token returned by gh auth token doesn't support Copilot

This is still true, and it's true for many other tokens too. There is no official way to get an OAuth token with Copilot support.

現状CopilotのAPI自体が非公開APIなので、そのスコープをもったトークンを払い出せる正式な方法は存在せず、なので環境変数も非公式扱いであるという理解です。

回避策

試してみたところ、 ~/.config/github-copilot/apps.json に書いてある、 oauth_token の値を 環境変数 GITHUB_COPILOT_TOKEN または GH_COPILOT_TOKEN にセットして :Copilot status で認証が通ることを確認できました。適当にコードを編集するとちゃんと補完が出ます。
この状態で、 ~/.config/github-copilot/apps.json ファイルを削除してVimを再起動しても、環境変数の方が優先され問題ありませんでした。

あとはVimの起動時に1Password CLI経由で環境変数を差し込むような適当なシェル関数を書いて、ローカルに平文が残らないようにしました。

cvi(){ env GH_COPILOT_TOKEN="$(op read op://Dev/GitHub/GH_COPILOT_TOKEN)" vi "$@" }

トークンの保存場所や環境変数への注入方法は、各自の環境に合わせて適宜読み替えて下さい。

まとめ

現状非公式な方法ではあるものの、copilot.vimがGitHub認証のOAuthトークンは環境変数GITHUB_COPILOT_TOKEN または GH_COPILOT_TOKEN で渡せる。ただし、CopilotのAPIを叩けるスコープを持ったトークンを発行するにはGitHub Copilot PluginのGtiHub Apps認証経由で生成する必要がある。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?