コンテンツにスキップ

パスキーでのサインイン(試験的)

近年は、パスキーでのサインインを求める証券会社が増えています。お使いの証券会社がそうなら、 Cookie をブラウザからコピーする代わりに、briskapi がサインインして BRiSK のセッション Cookie を保存できます。SBI証券、松井証券、マネックス証券、SMBC日興証券、立花証券 e支店の BRiSK に対応し、他の証券会社も追加できます。Chrome、Node 22 以上、そしてパスキーの安全な保管先(macOS のキーチェーンまたは Windows の資格情報マネージャー。Linux では選択式の本人のみ読み取り可のファイル)が必要です。macOS と Windows で動作し(Windows では PowerShell か cmd から実行し、WSL ではなく Windows 側の Chrome と Node を使います)、Linux でもテストしています。

仕組み

パスキーは1組の鍵です。公開鍵は証券会社が持ち、秘密鍵は通常、スマートフォンやパソコン、パスワードマネージャーの中にあります。指紋や PIN で秘密鍵が使われ、証券会社が送るチャレンジに署名することで、本人であることを証明します。briskapi はこの仕組みを借ります。専用の Chrome を起動し、その Chrome が持つ仮想オーセンティケーター(スマートフォンの代わりを務め、確認なしで署名するソフトウェア)が署名します。証券会社のサイトは、その違いを見分けられません。

  1. 初回のみ brisk enroll。 証券会社を選ぶと、別の Chrome ウィンドウがそのログインページで開きます(普段の Chrome ではなく、一時的なプロファイルです)。いつもどおりサインインし、新しいスマートフォンに登録するときと同じように、証券会社のセキュリティ設定でパスキーを登録します。仮想オーセンティケーターがそれを受け取ります。サイトに登録完了と表示されたら、ターミナルで Enter を押してください。briskapi がパスキーと選んだ証券会社をキーチェーン(Windows では資格情報マネージャー)に保存し、Chrome は閉じます。 e支店では、パスキーの前にユーザIDを入力するフォームのため、enroll が最初にユーザIDを尋ね、パスキーと一緒に保存します。ウィンドウは通常のログイン(ユーザID、暗証番号、電話番号認証)で開きます。パスキーはログイン後に表示される登録画面か、お客様情報 › 設定情報 › パスキー認証から登録してください。
  2. 毎回 brisk login。 保存したパスキーを読み込んだ同じ Chrome が開き、ログインページでパスキーのボタンを押すと、仮想オーセンティケーターが署名します。そのウィンドウで証券会社のサイトから BRiSK を開いてください(--launch-url を指定すれば自動で開きます)。briskapi が BRiSK のセッション Cookie を読み取って保存し、Chrome を閉じます。
  3. あとは使うだけ。 5社のどれでも、保存した Cookie を brisk live --site sbi(またはその証券会社のサイト)と briskapi.brisk API が使います。ご自身で追加した証券会社には briskapi のデータクライアントがないため、Cookie はご自身の利用のために保存される(~/.config/brisk/cookies/)だけです。

スマートフォンやパスワードマネージャーにある既存のパスキーには手を加えません。証券会社の一覧にパスキーが1つ増えるだけで、セキュリティ設定からいつでも削除できます。

注意点

  • 保存したパスキーは認証情報です。 持っている人は誰でも、追加の確認なしにあなたの証券口座へサインインできます。パスキーはキーチェーン/資格情報マネージャーにのみ保存され(BRISK_PASSKEY_STORE=file なら本人のみ読み取り可のファイルに保存しますが、安全性は下がります。Windows ではそのファイルの保護はユーザープロファイルのフォルダー(本人と管理者のみ読み取り可)に依存します)、お使いのマシンの外には出ず、ログにも表示されません。e支店ではユーザIDも同じ場所に一緒に保存します。brisk forget でここから削除できます。証券会社側でも削除してください。
  • 試験的な機能です。 各証券会社のログインページ、パスキーボタンの文言、BRiSK の起動方法は公開ページをもとにしたもので、実際の口座では試していません。--login-url、--passkey-button、 --launch-url や下記の sites.json で上書きでき、うまくいかない点はぜひお知らせください。
  • 証券会社に拒否される可能性があります。 Chrome は自動操作されていることをサイトに伝えます。利用前に、証券会社の規約でこの使い方が認められているかご確認ください。

コマンド

brisk sites                    # 選べる証券会社と BRiSK のアドレス
brisk enroll [--site matsui]   # 初回のみ。指定しなければ証券会社を選ぶよう求められます
brisk login                    # 毎回。enroll で登録した証券会社にサインインします
brisk forget                   # 保存したパスキーを削除

Python では passkey.enroll(site="matsui")(e支店では passkey.enroll(site="e-shiten", user_id="..."))と signin = passkey.login() を使います。signin.cookies が BRiSK の Cookie、signin.client がデータクライアントのある証券会社でのクライアントです。

証券会社を追加したり、組み込みの設定を直したりするには、~/.config/brisk/sites.json を編集します。

{"sites": [{"id": "mybroker", "name": "My Broker", "login_url": "https://broker.example/login",
            "cookie_host": "mybroker.brisk.jp", "passkey_button": "パスキーでログイン"}]}

ほかのキー: cookie_prefix、launch_url、enroll_url(初回のサインインがパスキーのページとは別のページの場合に enroll を始める場所)、user_field(パスキーのボタンを押す前に入力が必要なユーザID欄の CSS セレクター。指定すると enroll がユーザIDを尋ねます)。

内部の仕組みは ARCHITECTURE.md を参照してください。