vaultwarden で passkeys を使用する際の問題

セルフホストの Discourse インスタンスのユーザーです。パスキーを追加するボタンが表示されます。クリックすると Vaultwarden プラグインが開いて追加しようとしますが、次のメッセージが表示されます。

パスキー登録プロセスがタイムアウトしたか、キャンセルされたか、または許可されていません。

Firefox を使用しており、GitHub などで既にパスキーを追加しているので、Firefox と Vaultwarden では機能していますが、この特定の Discourse フォーラムでは何らかの理由で機能しません。管理者に伝えたところ、有効になっているとのことでした(そうでなければ、追加ボタンが表示されないはずですよね?)。

「いいね!」 2

Jappe様

ご連絡ありがとうございます。これはVaultwarden固有の問題であるため、別のトピックに移動しました(ちなみに、Vaultwardenには独自のDiscourseフォーラムがあります :tada:)。

この問題はFirefoxのVaultwarden拡張機能でのみ発生しますか?他のブラウザは試しましたか?

もし私がこれをテストするとしたら、Vaultwardenサーバーをセットアップする必要がありますか?

「いいね!」 4

Vaultwarden と Bitwarden Firefox プラグインが問題の原因ではないと思います。なぜなら、Passkey 連携は GitHub のような他のサービスでも機能するからです。
また、この特定のメッセージは、not_allowed_error を示している Discourse の YML ファイルでも見つけることができます。

わかりません。実際には Firefox 用の公式 Bitwarden 拡張機能ですが、自己ホスト型の Vaultwarden インスタンスを使用しています。
Windows 版 Firefox で最初に問題が発生しましたが、Fedora 版 Firefox でも試しました。
現在、Windows 版 Google Chrome でテストします。
Chrome でも同様に失敗しましたが、開発者ツールを確認したところ、以下のことがわかりました。

Firefox コンソール出力
Content-Security-Policy: ページのサイト設定により、blob:https://dietpi.com/b23d5e0c-dc61-4df8-b71b-88c5cd7f271a のリソース ("img-src") の読み込みがブロックされました。

Object { jqXHR: {…}, textStatus: "error", errorThrown: "" }
errorThrown: ""
jqXHR: Object { readyState: 4, getResponseHeader: getResponseHeader(e), getAllResponseHeaders: getAllResponseHeaders(), … }
abort: function abort(e)
always: function always()
catch: function catch(e)
done: function add()
fail: function add()
getAllResponseHeaders: function getAllResponseHeaders()
getResponseHeader: function getResponseHeader(e)
jqTextStatus: "error"
overrideMimeType: function overrideMimeType(e)
pipe: function pipe()
progress: function add()
promise: function promise(e)
readyState: 4
requestedUrl: "/forum/u/register_passkey.json"
responseJSON: Object { errors: (1) […] }
responseText: '{"errors":["The origin of the authentication request does not match the server origin."]}'
setRequestHeader: function setRequestHeader(e, t)
state: function state()
status: 401
statusCode: function statusCode(e)
statusText: "error"
then: function then(e, n, i)
<prototype>: Object { … }
textStatus: "error"
<prototype>: Object { … }
__defineGetter__: function __defineGetter__()
__defineSetter__: function __defineSetter__()
__lookupGetter__: function __lookupGetter__()
__lookupSetter__: function __lookupSetter__()
__proto__:
constructor: function Object()
hasOwnProperty: function hasOwnProperty()
isPrototypeOf: function isPrototypeOf()
propertyIsEnumerable: function propertyIsEnumerable()
toLocaleString: function toLocaleString()
toString: function toString()
valueOf: function valueOf()
<get __proto__()>: function __proto__()
<set __proto__()>: function __proto__()
chunk.6d10396b901f5b95b67e.d41d8cd9.js:1:2114375
    createPasskey https://dietpi.com/forum/assets/chunk.6d10396b901f5b95b67e.d41d8cd9.js:1

Chrome でも同様です。

Failed to load resource: the server responded with a status of 401 ()
chunk.6d10396b901f5b95b67e.d41d8cd9.js:1 Object

サーバーの設定ミスでしょうか?

はい、またはプロバイダーを使用します。Bitwarden 自体には個人利用向けの無料プランがあります。
必要であれば、さらに情報を提供したり、テストしたりすることもできます。

「いいね!」 1

さらにテストを行いました。
「追加」ボタンをクリックするとポップアップが表示され、その時点で createPasskey 関数からコンソールにエラーが表示されます。

Object { jqXHR: {…}, textStatus: "error", errorThrown: "" }
chunk.6d10396b901f5b95b67e.d41d8cd9.js:1:2114375
    createPasskey https://dietpi.com/forum/assets/chunk.6d10396b901f5b95b67e.d41d8cd9.js:1

そして、パスキーが作成されなかったため、実際のボールトへの追加が失敗します。

前の投稿の最初のエラーメッセージは、おそらくこの問題とは関係なく、dietpiサーバーでのCORS関連の問題だと思われます。 Content-Security-Policy に関する最初のエラーメッセージは、Dark-reader拡張機能から発生したものです。

「いいね!」 1

はい、投稿されたログから、主なエラーメッセージは次のとおりです。

認証リクエストの発信元がサーバーの発信元と一致しません。

パスキーとセキュリティキーの登録では、登録を行うサイトのURLがクライアント(ブラウザ)とサーバーの間で一致するかどうかを確認します。このインスタンスでは、不一致が発生している可能性が最も高いです。時にはhttpとhttpsの違いであったり、プロキシであったりします。

最初に確認すべきことは、「httpsを強制する」サイト設定が有効になっているかどうかです。

「いいね!」 2

また、@JappeHallunken、一般的な問題がないことを確認するために…ここでメタのアカウントにパスキーを追加していただけますか?

「いいね!」 1

はい、ここでメタのアカウントにパスキーを正常に追加できました。

これを報告します!助けてくれてありがとう。

最初にこちら側で発生した問題はCSPで、blob: 画像ソースが許可されていませんでした。現在、設定が不足しているか無効になっているようですが、見つけることができません。

[AdminSidebar] Custom link root_admin_additional_root_admin_upgrade must have a valid I18n label, got admin.docker.upgrade_tab chunk.6d10396b901f5b95b67e.d41d8cd9.js:1:2588880

Object { jqXHR: {…}, textStatus: "error", errorThrown: "" }
errorThrown: ""
jqXHR: Object { readyState: 4, getResponseHeader: getResponseHeader(e), getAllResponseHeaders: getAllResponseHeaders()
, … }
textStatus: "error"
<prototype>: Object { … }
chunk.6d10396b901f5b95b67e.d41d8cd9.js:1:2114375
    createPasskey https://dietpi.com/forum/assets/chunk.6d10396b901f5b95b67e.d41d8cd9.js:1

しかし、おそらくあなたが正しいでしょう。これは401の単なる症状にすぎません。

HTTPSは、Cloudflareプロキシとウェブサーバーのリダイレクト、およびforce https設定、HSTS、プリロードなどによってすでに強制されています。このDiscourseインスタンスにプレーンHTTPでアクセスする方法はありません :wink:

問題は、Discourseがドメインのルートではなく、/forumサブパスに配置されていることかもしれません。

「いいね!」 3

おっしゃる通りだと思います。問題はサブフォルダの設定に関連しているようです。すぐにコードを詳しく見てみます。

「いいね!」 3

FIX: Webauthn origin was incorrect for subfolder setups (#25651) · discourse/discourse@021a02c · GitHub をマージしました。@MichaIng さん、サイトを再構築して問題が解決するか確認していただけますか?

「いいね!」 2

完了しました。@JappeHallunken 再度試行できますか?

「いいね!」 3

はい、今動作しています。素晴らしいです!
解決にご協力いただいた皆様、ありがとうございました!

「いいね!」 2

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.