Errore durante la creazione della passkey utente nel browser

quando tento creare una passkey sul mio sito, mi ricorda

Il processo di registrazione della passkey è scaduto, è stato annullato o non è consentito

ma posso creare una passkey nel forum meta di discourse nello stesso browser (Microsoft Edge) e nello stesso plugin (Apple Passkey)

ho aggiornato il mio discourse all’ultima versione, ma non funziona come questo post

Ehi, sembra che venga visualizzato un errore della console quando questo messaggio che condividi appare in una finestra di dialogo.

Potresti aprire la console del tuo browser e condividere con noi l’errore che potresti vedere?


sembra che non ci sia nulla riguardo a questo errore nei log

Dovrai controllare il log della console del tuo browser, non il sito /logs.

È corretto?

forum.beginner.center/:1  Contenuto misto: la pagina su 'https://forum.beginner.center/' è stata caricata tramite HTTPS, ma ha richiesto un carattere non sicuro 'http://forum.beginner.center/fonts/JetBrainsMono-Regular.woff2?v=0.0.19'. Questa richiesta è stata bloccata; il contenuto deve essere servito tramite HTTPS.
forum.beginner.center/:1  Contenuto misto: la pagina su 'https://forum.beginner.center/' è stata caricata tramite HTTPS, ma ha richiesto un carattere non sicuro 'http://forum.beginner.center/fonts/JetBrainsMono-Bold.woff2?v=0.0.19'. Questa richiesta è stata bloccata; il contenuto deve essere servito tramite HTTPS.
app.js:270 ℹ️ Discourse v3.5.0.beta9-dev — https://github.com/discourse/discourse/commits/33dfd7dba9 — Ember v5.12.0
[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

[Solo segnalazione] Rifiutato di valutare una stringa come JavaScript perché 'unsafe-eval' non è una sorgente consentita di script nella seguente direttiva della Policy di sicurezza del contenuto: \"script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'\".

analytics.eu.umami.is/script.js:1   Risorsa non caricata: net::ERR_CONNECTION_CLOSED
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
Tracking Prevention ha bloccato l'accesso allo storage per <URL>.
deprecated.js:62  Avviso di deprecazione: l'impostazione della proprietà timezone dell'oggetto utente è deprecata. Utilizzare invece l'oggetto user_option [deprecato da Discourse 2.9.0.beta12] [rimozione in Discourse 3.0.0.beta1] [id deprecazione: discourse.user.userOptions]
a @ deprecated.js:62
security:1 L'elaborazione di Autofocus è stata bloccata perché un documento ha già un elemento attivo.
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 (Non autorizzato)
send @ jquery.js:9940
ajax @ jquery.js:9521
o @ ajax.js:188
(anonimo) @ 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
(anonimo) @ index.js:250
submit @ confirm-session.gjs:84
await in submit
(anonimo) @ 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
(anonimo) @ index.js:250
submit @ confirm-session.gjs:84
await in submit
(anonimo) @ 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 Mi Piace

Oh, hmm, questo è utile, ma i 401 possono essere attivati da una miriade di ragioni. Verificherò con il nostro esperto di passkey residente.

1 Mi Piace

Puoi assicurarti che il tuo sito sia configurato per servire tutto tramite https? La verifica della sfida della passkey richiede che tutte le richieste passino attraverso https. Inoltre, il dominio tra browser e server deve corrispondere esattamente. Se c’è una discrepanza da qualche parte, la verifica fallirà.

Abbiamo un’impostazione per questo, force_https, puoi provare quella, potrebbe aiutare (anche se fai attenzione, potrebbe anche bloccarti se il server non è configurato correttamente).

2 Mi Piace

questo è il mio app.yml
sto usando un reverse proxy con OpenResty (basato su nginx)

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

non riesco ad accedere al mio sito tramite la porta https 6443

quindi ho configurato solo il reverse proxy http

questa è la mia configurazione 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;
}

questa è la configurazione del reverse proxy

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";
}

Ciao, qualcuno può aiutarmi?

Mi scuso per il ritardo. Il problema qui è effettivamente correlato al tuo proxy. Non posso dire esattamente quale sia, ma uno tra il nome di dominio, il protocollo (http o https) e la porta sta creando problemi.

Le passkey verificano che il frontend e il backend vengano eseguiti sullo stesso dominio, protocollo e porta. Se uno di questi non corrisponde, otterrai un errore come questo.

Nel Rails CLI, puoi provare questo:

DiscourseWebauthn.origin

e confrontarlo con l’URL che utilizzi per accedere al sito nel browser? I due dovrebbero corrispondere.

la funzione passkey dell’utente ha funzionato quando ho abilitato force https

riferimento

2 Mi Piace

Per quanto ne capisco lo standard Webauthn per Passkey, si basa su una connessione sicura tra la Relying Party (Discourse) e il Client (Browser o dispositivo mobile) e l’Authenticator (ad es. uno yubikey). Pertanto abbiamo bisogno di https per la comunicazione proveniente dall’applicazione Discourse. Forzare https potrebbe essere la soluzione, ma anche solo un header per
proxy_set_header X-Forwarded-Proto https;
potrebbe essere sufficiente. Se forzare https aiuta (cosa comunque raccomandata), tutto va bene.

1 Mi Piace

Non so come configurare proxy_set_header X-Forwarded-Proto \n\nin app.yaml?