Erro ao criar passkey de usuário no navegador

quando tento criar uma passkey no meu próprio site, ele me lembra

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

mas consigo criar uma passkey no fórum discourse meta no mesmo navegador (Microsoft Edge) e no mesmo plugin (Apple Passkey)

atualizei meu discourse para a versão mais recente, mas não funciona como esta postagem

Ei, parece que exibimos um erro no console quando esta mensagem que você compartilha aparece em uma caixa de diálogo.

Você poderia abrir o console do seu navegador e compartilhar conosco o erro que você pode ver?


parece que não há nada sobre este erro nos logs

Você precisará ver o log do console do seu navegador, não o /logs do site.

Está correto?

forum.beginner.center/:1  Conteúdo Misto: A página em 'https://forum.beginner.center/' foi carregada via HTTPS, mas solicitou uma fonte insegura 'http://forum.beginner.center/fonts/JetBrainsMono-Regular.woff2?v=0.0.19'. Esta solicitação foi bloqueada; o conteúdo deve ser servido via HTTPS.
forum.beginner.center/:1  Conteúdo Misto: A página em 'https://forum.beginner.center/' foi carregada via HTTPS, mas solicitou uma fonte insegura 'http://forum.beginner.center/fonts/JetBrainsMono-Bold.woff2?v=0.0.19'. Esta solicitação foi bloqueada; o conteúdo deve ser servido via HTTPS.
app.js:270 ℹ️ Discourse v3.5.0.beta9-dev — https://github.com/discourse/discourse/commits/33dfd7dba9 — Ember v5.12.0
[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] Recusado(a) a avaliar uma string como JavaScript porque 'unsafe-eval' não é uma fonte permitida de script na seguinte diretiva de Política de Segurança de Conteúdo: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

analytics.eu.umami.is/script.js:1   Falha ao carregar recurso: net::ERR_CONNECTION_CLOSED
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
A Prevenção de Rastreamento bloqueou o acesso ao armazenamento para <URL>.
deprecado.js:62  Aviso de Depreciação: Definir a propriedade timezone do objeto user está depreciada. Use o objeto user_option em vez disso [depreciado desde Discourse 2.9.0.beta12] [remoção em Discourse 3.0.0.beta1] [id de depreciação: discourse.user.userOptions]
a @ deprecated.js:62
security:1 O processamento de Autofocus foi bloqueado porque um documento já possui um elemento focado.
completion_list.html:14   GET chrome-extension://mfbcdcnpokpoajjciilocoachedjkima/heuristicsRedefinitions.js net::ERR_FILE_NOT_FOUND
completion_list.html:13   GET chrome-extension://mfbcdcnpokpoajjciilocoachedjkima/extensionState.js net::ERR_FILE_NOT_FOUND
completion_list.html:12   GET chrome-extension://mfbcdcnpokpoajjciilocoachedjkima/utils.js net::ERR_FILE_NOT_FOUND
ajax.js:188   POST https://forum.beginner.center/u/register_passkey.json 401 (Não Autorizado)
send @ jquery.js:9940
ajax @ jquery.js:9521
o @ ajax.js:188
(anonymous) @ rsvp-DaQAFb0W.js:435
e @ rsvp-DaQAFb0W.js:451
A @ ajax.js:201
registerPasskey @ user.js:650
createPasskey @ user-passkeys.gjs:86
await in createPasskey
didConfirm @ user-passkeys.gjs:140
didConfirmWrapped @ dialog.js:134
_join @ index.js:788
join @ index.js:605
p @ index.js:152
(anonymous) @ index.js:250
submit @ confirm-session.gjs:84
await in submit
(anonymous) @ d-button.gjs:138
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_later @ index.js:823
later @ index.js:652
T @ index.js:562
_triggerAction @ d-button.gjs:135
click @ d-button.gjs:93
user-passkeys.gjs:104  {jqXHR: {…}, textStatus: 'error', errorThrown: ''}errorThrown: \"\"jqXHR: abort: ƒ (e)always: ƒ ()catch: ƒ (e)done: ƒ ()fail: ƒ ()getAllResponseHeaders: ƒ ()getResponseHeader: ƒ (e)jqTextStatus: \"error\"overrideMimeType: ƒ (e)pipe: ƒ ()progress: ƒ ()promise: ƒ (e)readyState: 4requestedUrl: \"/u/register_passkey.json\"responseJSON: {errors: Array(1)}responseText: \"{\\\"errors\\\":[\\\"The origin of the authentication request does not match the server origin.\\\"]}\"setRequestHeader: ƒ (e,t)state: ƒ ()status: 401statusCode: ƒ (e)statusText: \"error\"then: ƒ (e,i,n)[[Prototype]]: ObjecttextStatus: \"error\"[[Prototype]]: Objectconstructor: ƒ Object()hasOwnProperty: ƒ hasOwnProperty()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toLocaleString: ƒ toLocaleString()toString: ƒ toString()valueOf: ƒ valueOf()__defineGetter__: ƒ __defineGetter__()__defineSetter__: ƒ __defineSetter__()__lookupGetter__: ƒ __lookupGetter__()__lookupSetter__: ƒ __lookupSetter__()__proto__: (...)get __proto__: ƒ __proto__()set __proto__: ƒ __proto__()
createPasskey @ user-passkeys.gjs:104
await in createPasskey
didConfirm @ user-passkeys.gjs:140
didConfirmWrapped @ dialog.js:134
_join @ index.js:788
join @ index.js:605
p @ index.js:152
(anonymous) @ index.js:250
submit @ confirm-session.gjs:84
await in submit
(anonymous) @ d-button.gjs:138
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_later @ index.js:823
later @ index.js:652
T @ index.js:562
_triggerAction @ d-button.gjs:135
click @ d-button.gjs:93
1 curtida

Ah, interessante, mas erros 401 podem ser acionados por uma infinidade de razões. Verificarei com nosso especialista residente em passkeys.

1 curtida

Você pode garantir que seu site esteja configurado para servir tudo em https? A verificação de desafio de chave de acesso exige que todas as solicitações passem por https. Além disso, o domínio entre o navegador e o servidor deve corresponder exatamente. Se houver uma incompatibilidade em algum lugar, a verificação falhará.

Temos uma configuração para isso, force_https, você pode tentar, pode ajudar (embora tenha cuidado, também pode bloquear você se o servidor não estiver configurado corretamente).

2 curtidas

Este é o meu app.yml
Estou usando um proxy reverso com OpenResty (baseado em nginx)

expose:
  - "6180:80"   # http
  - "6443:443" # https
  - "587:587"

Não consigo usar meu site pela porta 6443 https

Então, configurei apenas o proxy reverso http

Esta é a minha configuração do OpenResty

server {
    listen 80 ; 
    listen 443 ssl http2 ; 
    server_name forum.beginner.center; 
    index index.php index.html index.htm default.php default.htm default.html; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Host $server_name; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    access_log /www/sites/forum.beginner.center/log/access.log main; 
    error_log /www/sites/forum.beginner.center/log/error.log; 
    location ^~ /.well-known/acme-challenge {
        allow all; 
        root /usr/share/nginx/html; 
    }
    if ($scheme = http) {
        return 301 https://$host$request_uri; 
    }
    ssl_certificate /www/sites/forum.beginner.center/ssl/fullchain.pem; 
    ssl_certificate_key /www/sites/forum.beginner.center/ssl/privkey.pem; 
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; 
    ssl_prefer_server_ciphers on; 
    ssl_session_cache shared:SSL:10m; 
    ssl_session_timeout 10m; 
    error_page 497 https://$host$request_uri; 
    proxy_set_header X-Forwarded-Proto https; 
    add_header Strict-Transport-Security "max-age=31536000"; 
    include /www/sites/forum.beginner.center/proxy/*.conf; 
}

esta é a configuração do proxy reverso

location ^~ / {
    proxy_pass http://127.0.0.1:6180; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.1; 
    add_header X-Cache $upstream_cache_status; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name off; 
    proxy_ssl_name $proxy_host; 
    add_header Strict-Transport-Security "max-age=31536000"; 
}

olá, alguém pode me ajudar?

Desculpe pelo atraso. O problema aqui está realmente relacionado ao seu proxy. Não consigo dizer exatamente o que é, mas um dos seus nomes de domínio, protocolo (http ou https) e porta está atrapalhando.

O Passkeys verifica se o frontend e o backend são executados no mesmo domínio, protocolo e porta. Se houver uma incompatibilidade em um desses itens, você receberá um erro como este.

No Rails CLI, você pode tentar o seguinte:

DiscourseWebauthn.origin

e compará-lo com a URL que você usa para acessar o site no navegador? Os dois devem corresponder.

a função de chave de acesso do usuário funcionou quando ativei forçar https

referência

2 curtidas

Pelo que entendi do Padrão Webauthn para Passkey, ele depende de uma conexão segura entre a Parte Confiável (Discourse) e o Cliente (Navegador ou dispositivo móvel) e o Autenticador (por exemplo, um yubikey). Assim, precisamos de https para a comunicação vinda do aplicativo Discourse. Forçar https pode ser a solução, mas apenas um cabeçalho para
proxy_set_header X-Forwarded-Proto https;
também pode ser suficiente. Se forçar https ajudar (o que é recomendado de qualquer forma), tudo ficará bem.

1 curtida

Não sei como configurar proxy_set_header X-Forwarded-Proto no app.yaml.