Problemas al usar passkeys con vaultwarden

Soy un usuario de una instancia de Discourse autoalojada, veo el botón para agregar passkeys. Cuando hago clic, mi plugin Vaultwarden se abre para agregarlo, pero luego recibo un mensaje

El proceso de registro de passkey ha caducado, ha sido cancelado o no está permitido.

Estoy en Firefox y ya he agregado passkeys, por ejemplo, para GitHub, por lo que está funcionando en Firefox con Vaultwarden, pero por alguna razón no en este foro de Discourse en particular. Se lo dije a los administradores y dijeron que está habilitado (de lo contrario, no vería el botón de agregar, ¿verdad?).

2 Me gusta

Hola Jappe,

Gracias por escribir. He movido esto a un tema separado ya que es un problema específico con Vaultwarden (que, por cierto, tiene su propio foro de Discourse :tada: ).

¿Sabes si este problema solo ocurre con la extensión Vaultwarden en Firefox? ¿Has probado otros navegadores?

Si tuviera que probar esto, ¿necesitaría configurar un servidor Vaultwarden?

4 Me gusta

Creo que vaultwarden y el complemento de Firefox de Bitwarden no son el problema, ya que la integración de passkey funciona con otros servicios como GitHub.
También puedo encontrar este mensaje específico en un archivo yml de discourse, que indica un not_allowed_error.

No lo sé, en realidad es la extensión oficial de Bitwarden para Firefox, pero uso una instancia de Vaultwarden autoalojada.
También probé Firefox en Fedora, el problema inicial ocurrió en Firefox para Windows.
Ahora probaré con Google Chrome en Windows.
Ok, también falla allí, pero eché un vistazo a las herramientas de desarrollador y encontré esto:

Salida de la consola de Firefox
Content-Security-Policy: La configuración de la página ha bloqueado la carga de un recurso en 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

Prácticamente lo mismo en Chrome:

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

¿Entonces probablemente una mala configuración del servidor?

Sí, o usar un proveedor. Bitwarden en sí tiene un nivel gratuito para uso personal.
También puedo proporcionar más información y pruebas si es necesario.

1 me gusta

Hice más pruebas:
Hago clic en el botón “Añadir”, aparece la ventana emergente y en este punto ya tengo el error en la consola de la función createPasskey.

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

Y entonces falla la adición real a la bóveda, porque no se creó ninguna passkey.

El primer mensaje de error de la publicación anterior probablemente no esté relacionado con este problema, sino con algo de CORS en el servidor de dietpi. El primer mensaje de error sobre Content-Security-Policy se originó en la extensión Dark-reader)

1 me gusta

Sí, por los registros que publicaste, el mensaje de error principal es este:

El origen de la solicitud de autenticación no coincide con el origen del servidor.

El registro de claves de acceso y claves de seguridad comprueba que la URL del sitio que realiza el registro coincida entre el cliente (navegador) y el servidor. Lo más probable es que esta instancia tenga una discrepancia, a veces es http frente a https, otras veces son proxies.

Lo primero que comprobaría es si la configuración del sitio forzar https está habilitada.

2 Me gusta

Además, @JappeHallunken, solo para descartar cualquier problema general… ¿puedes añadir una clave de acceso a tu cuenta aquí en meta?

1 me gusta

Sí, pude añadir una clave de acceso con éxito aquí en meta.

¡Informaré de esto! Gracias por tu ayuda.

El primer problema de nuestro lado fue CSP, que no permitía fuentes de imagen blob:. Ahora, efectivamente, parece faltar alguna configuración o es inválida, pero no puedo encontrarla:

[AdminSidebar] El enlace personalizado root_admin_additional_root_admin_upgrade debe tener una etiqueta I18n válida, se obtuvo 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

Pero supongo que tienes razón y solo es un síntoma del 401.

HTTPS ya está forzado a través del proxy de Cloudflare y la redirección del servidor web, y también la configuración de force https, HSTS, precarga, etc., no hay forma de acceder a esta instancia de Discourse a través de HTTP sin cifrar :wink:.

¿Podría ser un problema que Discourse esté en la subruta /forum, en lugar de en la raíz del dominio?

3 Me gusta

Creo que podrías tener razón, el problema parece estar relacionado con la configuración de la subcarpeta. Echaré un vistazo más de cerca al código en breve.

3 Me gusta

Acabo de fusionar FIX: Webauthn origin was incorrect for subfolder setups (#25651) · discourse/discourse@021a02c · GitHub, @MichaIng, ¿puedes reconstruir tu sitio y ver si eso soluciona el problema?

2 Me gusta

Hecho. @JappeHallunken ¿puedes volver a intentarlo?

3 Me gusta

¡Sí, ahora funciona, genial!
¡Gracias a todos por resolver esto!

2 Me gusta

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