WordPress の管理画面に、パスワードで入りますか。それとも、指紋か顔で入りますか。
私はこの半年、そこを作り替えていました。作りながら何度も詰まったのですが、いちばん時間を使ったのは認証そのものではありません。パスキーを登録した端末を失くした人を、どうやってサイトに戻すかでした。
そこを設計し終えて、Rapls Passkey という WordPress プラグインとして公開しています。無料版は WordPress.org から入ります。以下は、何を作ったのかと、どこで迷ったのかの記録です。
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 版と、機能の詳しい一覧は製品ページにあります。
関連記事
- Composer を積んだプラグインが、PHP のバージョンで白画面を出す ── このプラグインで実際に出した不具合と、その直し方
- WordPress で API キーを AES-256-GCM で保存する ── 鍵の置き場所についての実装記録
- WordPress.org に初めて出した自作プラグインが2回差し戻された話 ── 公開する側の手続きの記録




コメント