Erreur lors de la création du passkey utilisateur dans le navigateur

lorsque j’essaie de créer une passkey sur mon propre site, il me rappelle

Le processus d'enregistrement de la passkey a expiré, a été annulé ou n'est pas autorisé

mais je peux créer une passkey sur le forum Discourse Meta dans le même navigateur (Microsoft Edge) et avec le même plugin (Apple Passkey)

j’ai mis à jour mon Discourse vers la dernière version, mais cela ne fonctionne pas comme dans ce post

Salut, il semble que nous ayons une erreur de console lorsque ce message que vous partagez apparaît dans une boîte de dialogue.

Pourriez-vous ouvrir la console de votre navigateur et partager avec nous l’erreur que vous pourriez y voir ?


il semble qu’il n’y ait rien à propos de cette erreur dans les journaux

Vous devrez consulter le journal de la console de votre navigateur, pas le /logs du site.

Est-ce que c’est correct ?

forum.beginner.center/:1  Contenu mixte : La page « https://forum.beginner.center/ » a été chargée via HTTPS, mais a demandé une police de caractères non sécurisée « http://forum.beginner.center/fonts/JetBrainsMono-Regular.woff2?v=0.0.19 ». Cette requête a été bloquée ; le contenu doit être servi via HTTPS.
forum.beginner.center/:1  Contenu mixte : La page « https://forum.beginner.center/ » a été chargée via HTTPS, mais a demandé une police de caractères non sécurisée « http://forum.beginner.center/fonts/JetBrainsMono-Bold.woff2?v=0.0.19 ». Cette requête a été bloquée ; le contenu doit être servi via HTTPS.
app.js:270 ℹ️ Discourse v3.5.0.beta9-dev — https://github.com/discourse/discourse/commits/33dfd7dba9 — Ember v5.12.0
[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

[Report Only] Refusé d'évaluer une chaîne en tant que JavaScript car « unsafe-eval » n'est pas une source autorisée de script dans la directive de politique de sécurité du contenu suivante : « script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic' ».

analytics.eu.umami.is/script.js:1   Échec du chargement de la ressource : net::ERR_CONNECTION_CLOSED
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
La prévention du suivi a bloqué l'accès au stockage pour <URL>.
deprecated.js:62  Avis de dépréciation : La définition de la propriété timezone de l'objet user est dépréciée. Utilisez l'objet user_option à la place [déprécié depuis Discourse 2.9.0.beta12] [suppression dans Discourse 3.0.0.beta1] [id de dépréciation : discourse.user.userOptions]
a @ deprecated.js:62
security:1 Le traitement Autofocus a été bloqué car un document a déjà un élément focalisé.
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 (Unauthorized)
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 « J'aime »

Oh hmm, c’est utile, mais les erreurs 401 peuvent être déclenchées par une multitude de raisons. Je vais vérifier avec notre expert résident en passkeys.

1 « J'aime »

Pouvez-vous vous assurer que votre site est configuré pour tout servir en https ? La vérification du défi de la clé d’accès nécessite que toutes les requêtes passent par https. De plus, le domaine entre le navigateur et le serveur doit correspondre exactement. S’il y a une incohérence quelque part, la vérification échouera.

Nous avons un paramètre pour cela, force_https, vous pouvez essayer, cela pourrait aider (mais faites attention, cela pourrait aussi vous bloquer si le serveur n’est pas correctement configuré).

2 « J'aime »

Voici mon app.yml
J’utilise un proxy inverse OpenResty (basé sur nginx)

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

Je ne peux pas accéder à mon site via le port https 6443

J’ai donc seulement configuré le proxy inverse http

Voici ma configuration 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;
}

voici la configuration du proxy inverse

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

Bonjour, quelqu’un peut m’aider ?

Désolé pour le retard. Le problème est effectivement lié à votre proxy. Je ne peux pas dire exactement ce que c’est, mais l’un de vos noms de domaine, protocoles (http ou https) et ports pose problème.

Les Passkeys vérifient que le frontend et le backend s’exécutent sur le même domaine, protocole et port. S’il y a une discordance, vous obtiendrez une erreur comme celle-ci.

Dans le CLI de Rails, pouvez-vous essayer ceci :

DiscourseWebauthn.origin

et le comparer à l’URL que vous utilisez pour accéder au site dans le navigateur ? Les deux devraient correspondre.

la fonction de clé d’accès utilisateur a fonctionné lorsque j’ai activé force https

référence

2 « J'aime »

Autant que je sache, la norme Webauthn pour Passkey repose sur une connexion sécurisée entre la partie de confiance (Discourse) et le client (navigateur ou appareil mobile) et l’authentificateur (par exemple, une yubikey). Ainsi, nous avons besoin de https pour la communication provenant de l’application Discourse. Forcer https pourrait être la solution, mais juste un en-tête pour

proxy_set_header X-Forwarded-Proto https;

pourrait également suffire. Si forcer https aide (ce qui est de toute façon recommandé), tout va bien.

1 « J'aime »

Je ne sais pas comment configurer proxy_set_header X-Forwarded-Proto
dans app.yaml ?