Проблемы с использованием ключей доступа в Vaultwarden

Я пользуюсь собственным экземпляром Discourse и вижу кнопку для добавления ключей доступа. При нажатии открывается плагин Vaultwarden для добавления, но затем появляется сообщение:

Процесс регистрации ключа доступа либо истёк по времени, либо был отменён, либо не разрешён.

Я использую Firefox и уже добавил ключи доступа, например для GitHub, так что в Firefox с Vaultwarden всё работает, но по какой-то причине не работает в этом конкретном форуме Discourse. Я сообщил об этом администраторам, и они сказали, что функция включена (иначе я бы не увидел кнопку добавления, верно?)

Привет, Jappe,

Спасибо за обращение. Я перенёс это в отдельную тему, так как это специфическая проблема Vaultwarden (кстати, у них есть собственный форум Discourse :tada:).

Вы знаете, возникает ли эта проблема только с расширением Vaultwarden в Firefox? Пробовали ли вы другие браузеры?

Если бы я хотел это проверить, мне бы пришлось настроить сервер Vaultwarden?

Я думаю, что Vaultwarden и расширение Bitwarden для Firefox не являются проблемой, поскольку интеграция с ключами доступа работает с другими сервисами, например GitHub.
Я также нашел это конкретное сообщение в одном из yml-файлов проекта Discourse, что указывает на not_allowed_error.

На самом деле я не знаю. Я использую официальное расширение Bitwarden для Firefox, но подключено к самодостаточному экземпляру Vaultwarden.
Я также пробовал Firefox на Fedora; первоначальная проблема возникла в Firefox для Windows.
Сейчас я протестирую Google Chrome на Windows.
Хорошо, там тоже происходит сбой, но я посмотрел в инструменты разработчика и обнаружил следующее:

Вывод консоли 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 есть бесплатный тариф для личного использования.
Если потребуется, я также могу предоставить дополнительную информацию и провести тестирование.

Провёл дополнительное тестирование:
Я нажимаю кнопку «Добавить», появляется всплывающее окно, и в этот момент в консоли уже отображается ошибка от функции createPasskey.

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

Затем фактическое добавление в хранилище не удаётся, так как ключ доступа не был создан.

{del}Первое сообщение об ошибке из предыдущего поста, вероятно, не связано с этой проблемой, а вызвано настройками CORS на сервере dietpi.{/del} Первое сообщение об ошибке, касающееся Content-Security-Policy, возникло из-за расширения Dark-reader.

Да, исходя из предоставленных вами логов, основное сообщение об ошибке звучит так:

Источник запроса аутентификации не совпадает с источником сервера.

При регистрации Passkey и ключей безопасности проверяется, совпадает ли URL сайта, выполняющего регистрацию, между клиентом (браузером) и сервером. Скорее всего, в вашем случае есть несовпадение: иногда это различие между http и https, в других случаях — проблема с прокси.

Первое, что я бы порекомендовал проверить, — включена ли настройка сайта force https.

Также, @JappeHallunken, чтобы исключить любые общие проблемы… не могли бы вы добавить ключ доступа к своей учетной записи здесь, на meta?

Да, я смог успешно добавить ключ доступа здесь, на meta.

Я сообщу об этом! Спасибо за вашу помощь.

Первая проблема на нашей стороне была связана с CSP, которая не позволяла использовать источники изображений blob:. Теперь действительно кажется, что какое-то настройка отсутствует или некорректна, но я не могу её найти:

[AdminSidebar] Пользовательская ссылка root_admin_additional_root_admin_upgrade должна иметь корректную метку I18n, получено 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, а не в корне домена?

Думаю, вы правы, проблема, похоже, связана с настройкой подпапки. Я вскоре подробнее изучу код.

Я только что слил FIX: Webauthn origin was incorrect for subfolder setups (#25651) · discourse/discourse@021a02c · GitHub, @MichaIng, не могли бы вы пересобрать свой сайт и посмотреть, исправит ли это проблему?

Готово. @JappeHallunken, попробуй ещё раз?

Да, теперь всё работает, отлично!
Спасибо всем за решение этой проблемы!