Problemas ao usar passkeys com vaultwarden

Sou um usuário de uma instância auto-hospedada do Discourse, vejo o botão para adicionar passkeys. Quando clico, meu plugin Vaultwarden abre para adicioná-lo, mas então recebo uma mensagem

O processo de registro da passkey expirou, foi cancelado ou não é permitido.

Estou no Firefox e já adicionei passkeys, por exemplo, para o GitHub, então está funcionando no Firefox com o Vaultwarden, mas por algum motivo não neste fórum Discourse em particular. Contei aos administradores e eles disseram que está habilitado (caso contrário, eu não veria o botão de adicionar, certo?)

2 curtidas

Olá Jappe,

Obrigado por entrar em contato. Movi isso para um tópico separado, pois é um problema específico com o Vaultwarden (que, aliás, tem seu próprio fórum Discourse :tada: ).

Você sabe se esse problema ocorre apenas com a extensão Vaultwarden no Firefox? Você já tentou outros navegadores?

Se eu fosse testar isso, precisaria configurar um servidor Vaultwarden?

4 curtidas

Acho que o vaultwarden e o plugin do Firefox do Bitwarden não são o problema, já que a integração de passkey funciona com outros serviços como o GitHub.
Também consigo encontrar esta mensagem específica em um arquivo yml do discourse, que indica um not_allowed_error.

Eu não sei, na verdade é a extensão oficial do Bitwarden para Firefox, mas eu uso uma instância auto-hospedada do Vaultwarden.
Eu também tentei o Firefox no Fedora, o problema inicial ocorreu no Firefox para Windows.
Vou testar agora com o Google Chrome no Windows.
Ok, também falha lá, mas dei uma olhada nas ferramentas de desenvolvedor e encontrei isto:

Saída do console do Firefox
Content-Security-Policy: As configurações da página bloquearam o carregamento de um recurso em 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

Praticamente o mesmo no Chrome:

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

Então, provavelmente uma má configuração do servidor?

Sim, ou usar um provedor. O próprio Bitwarden tem um nível gratuito para uso pessoal.
Também posso fornecer mais informações e testes, se necessário.

1 curtida

Fiz mais alguns testes:
Eu clico no botão “Adicionar”, o pop-up aparece e neste ponto eu já tenho o erro no console da função createPasskey.

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

E então a adição real ao cofre falha, porque nenhuma chave de acesso foi criada.

A primeira mensagem de erro da postagem anterior provavelmente não está relacionada a este problema, mas a alguma coisa de CORS no servidor dietpi. A primeira mensagem de erro sobre Content-Security-Policy originou-se da extensão Dark-reader)

1 curtida

Sim, a partir dos logs que você postou, a principal mensagem de erro é esta:

A origem da solicitação de autenticação não corresponde à origem do servidor.

O registro de passkey e chave de segurança verifica se o URL do site que está fazendo o registro corresponde entre o cliente (navegador) e o servidor. Muito provavelmente esta instância tem uma incompatibilidade, às vezes é http vs https, outras vezes são proxies.

A primeira coisa que eu verificaria é se a configuração do site forçar https está habilitada.

2 curtidas

Além disso, @JappeHallunken, apenas para descartar quaisquer problemas gerais… você pode adicionar uma chave de acesso à sua conta aqui no meta?

1 curtida

Sim, consegui adicionar uma chave de acesso com sucesso aqui no meta.

Vou reportar isso! Obrigado pela ajuda.

O primeiro problema do nosso lado foi o CSP, que não permitia fontes de imagem blob:. Agora, de fato, parece haver alguma configuração faltando/inválida, mas não consigo encontrá-la:

[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

Mas acho que você está certo e é apenas um sintoma do 401.

O HTTPS já é imposto via proxy Cloudflare e redirecionamento do servidor web, além da configuração force https, HSTS, preloading, etc. Não há como acessar esta instância do Discourse via HTTP puro :wink:.

Um problema pode ser que o Discourse esteja localizado em um subdiretório /forum, em vez da raiz do domínio?

3 curtidas

Acho que você pode estar certo, o problema parece estar relacionado à configuração do subdiretório. Vou dar uma olhada mais de perto no código em breve.

3 curtidas

Eu acabei de mesclar FIX: Webauthn origin was incorrect for subfolder setups (#25651) · discourse/discourse@021a02c · GitHub, @MichaIng, você pode reconstruir seu site e ver se isso resolve o problema?

2 curtidas

Feito. @JappeHallunken você pode tentar novamente?

3 curtidas

Sim, está funcionando agora, ótimo!
Obrigado a todos por resolverem isso!

2 curtidas

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