WordPress にパスキーでログインするプラグインを作りました|Rapls Passkey

WordPress の管理画面にパスキーでログインすることを表したアイキャッチ WordPress
この記事は約6分で読めます。

WordPress の管理画面に、パスワードで入りますか。それとも、指紋か顔で入りますか。

私はこの半年、そこを作り替えていました。作りながら何度も詰まったのですが、いちばん時間を使ったのは認証そのものではありません。パスキーを登録した端末を失くした人を、どうやってサイトに戻すかでした。

そこを設計し終えて、Rapls Passkey という WordPress プラグインとして公開しています。無料版は WordPress.org から入ります。以下は、何を作ったのかと、どこで迷ったのかの記録です。

YouTube video

2分で、登録からサインインまでの流れが見られます。

パスワードを置かない、という選択

パスキーは、速いログイン方法として説明されることが多いと思います。実装してみて感じたのは、そこではありませんでした。

パスキーで認証すると、サーバーに保存されるのは公開鍵だけです。秘密鍵は端末のセキュアな領域から出てきません。データベースが漏れても、そこにログインできる材料が入っていません。総当たりも、使い回しも、フィッシングで抜かれたパスワードも、対象そのものが無くなります。

パスキーでは秘密鍵が端末から出ず、サーバーには公開鍵だけが保存され、パスワードはそもそも保存されないことを示した図

速さは副産物です。パスワードを置かない選択、と考えるほうが実態に近い。

ブラウザ側では WebAuthn を素で叩いています。navigator.credentials に challenge を渡して、返ってきた署名を PHP 側で検証する。外部サービスは通していないので、認証のやりとりがサーバーの中で完結します。止まる場所が1つ減る、という意味でもあります。

ログイン画面を置き換えなかった

設計でいちばん早く決めたのが、ここでした。

WordPress のログイン画面を丸ごとパスキー専用にする作りも考えました。そのほうが見た目はきれいです。ただ、それをやると、端末が壊れた瞬間に誰もサイトに入れなくなる。管理者を締め出す装置になりかねません。

だから、既存のログイン画面にパスキーのボタンを1つ足す形にしました。パスワードは残したまま、日常はパスキーで済ませる。パスキーが使えない状況では、これまでどおりパスワードで入れます。

ボタンをどう見せるかでは少し迷いました。既存のスタイルに寄せると押されない。目立たせると怪しく見える。結局、ボタンの下に何が起きるかを一行書くのが、いちばん効きました。

複数の端末を登録できるようにした

1つしか登録していない状態が、いちばん危ない。

Mac と iPhone の両方を登録しておけば、片方が手元になくても入れます。登録済みのパスキーは、名前を付けて管理できるようにしました。「仕事用の Mac」「予備の iPhone」と分けておけば、機種変更のときにどれを消せばいいかが分かります。一時的に無効にして、あとで戻すこともできます。

作りながら気づいたのは、これは機能というより運用の話だということでした。パスキーを1つだけ登録して満足すると、そこが単一障害点になります。プラグイン側でできるのは、複数登録を面倒にしないことくらいです。

無料版でできること

WordPress.org で配っている無料版に入っているものを、簡潔に並べます。

  • パスワードレスサインイン(Touch ID / Windows Hello / Face ID / セキュリティキー)
  • パスキーの登録・改名・一時停止・再開
  • サイト全体のパスキー一覧(ユーザー → Passkeys)
  • 認証器の名前の表示
  • ショートコードとブロック(好きな場所にサインインボタンを置ける)
  • 2要素認証プラグインとの併用
  • reCAPTCHA v3 とレート制限
  • 監査ログと CSV 出力
  • WP-CLI コマンド
  • サイトヘルスへの表示、GDPR のデータ書き出し・削除への対応

動作要件は WordPress 6.0 以上、PHP 8.2 以上、HTTPS です。localhost は例外で、ローカル開発環境では HTTP のままでも動きます。

PHP 8.2 という要求は、実は自分で決めた数字ではありませんでした。依存している WebAuthn のライブラリが要求しているものです。これを見落としていて、PHP 8.2 未満の環境でサイトを白画面にする不具合を出しました。いまはバージョンを確認して、足りなければ動かずに警告を出すようにしてあります。

Pro 版で足したもの

有料版のほうは、ひとりのサイトより、人が複数いるサイト向けの機能が中心です。

  • クロスデバイスの QR ログイン(4桁の確認コード付き)
  • ロール別のパスキー必須化
  • リカバリーコード
  • マジックリンク
  • パスワードレスでの新規登録
  • アダプティブ・ステップアップ認証
  • 認証器のポリシー制御(MDS / AAGUID)
  • Webhook
  • マルチサイト対応

リカバリーコードとマジックリンクが、冒頭に書いた「端末を失くした人をどう戻すか」への答えです。鍵を強くするほど、締め出されたときの復旧経路が要ります。ここを用意しないまま必須化すると、管理者が自分のサイトに入れなくなる日が来ます。

価格は買い切りで、1サイト ¥2,980、5サイト ¥5,980(税込)。新発売の先行価格で、2026年12月31日までです。以降は ¥5,980 / ¥11,980 になります。1年間のアップデートとメールサポート込み、14日間の返金保証付き。

共用サーバーでも動きます

パスキー系のプラグインを調べていて引っかかったのが、PHP の拡張モジュールでした。WebAuthn の署名検証には数学的な処理が要るので、gmp のような拡張を要求するものがあります。共用レンタルサーバーでは有効になっていないことがある、という前提で作り始めました。

ところが確かめてみると、エックスサーバーの標準環境では gmp が最初から有効でした。前提が違っていたわけです。少なくともエックスサーバーでは、拡張モジュールを差別化の材料にはできません。

調べる前に「共用サーバーでは動かないものが多い」と書かなくてよかったと思っています。手を動かす前に決めつけていたら、そのまま記事に書いていました。

使ってみて、まだ決めかねていること

ロール別の必須化を、どこまで強くするかで迷っています。

管理者だけパスキー必須にすれば、いちばん危ないアカウントが守れます。ただ、その管理者が端末を失くしたときに、誰も助けられない。リカバリーコードを配っておけば戻れますが、そのコードを安全に保管できているかは、こちらからは見えません。

強くすればするほど、失敗したときの落差が大きくなる。この加減を、まだ自分の中で決めきれていません。

あなたのサイトの管理画面は、いまどうやって守っていますか。パスワードだけなら、パスキーを1つ足しておく価値はあると思います。両方を残したまま、日常だけ楽にする。それが最初の一歩として、いちばん安全な形だと思っています。

入手

無料版は WordPress.org のプラグインページから。管理画面の「プラグイン → 新規追加」で「Rapls Passkey」を検索してもインストールできます。

Pro 版と、機能の詳しい一覧は製品ページにあります。

関連記事

WordPress
この記事を書いた人
rapls

WordPressのプラグインを作っているフリーランスエンジニアです。Web開発はもう6年以上。WordPress.orgで Rapls AI Chatbot、Thanks Mail for Stripe、Rapls PDF Image Creator、Prime Cache の4本を公開し、保守を続けながら、日本語ロケールの翻訳エディター(PTE)も務めています。このブログに書くのは、現場で自分が実際にハマって、調べて、直した話です。

raplsをフォローする
raplsをフォローする

コメント

タイトルとURLをコピーしました