Fehler beim Erstellen des Benutzerschlüssels im Browser

Wenn ich versuche, einen Passkey auf meiner eigenen Website zu erstellen, erhalte ich die Meldung:

Der Registrierungsprozess für den Passkey ist abgelaufen, wurde abgebrochen oder ist nicht erlaubt

Aber ich kann einen Passkey im Discourse Meta Forum im selben Browser (Microsoft Edge) und mit demselben Plugin (Apple Passkey) erstellen.

Ich habe mein Discourse auf die neueste Version aktualisiert, aber es funktioniert nicht wie in diesem Beitrag.

Hey, es sieht so aus, als ob wir einen Konsolenfehler anzeigen, wenn diese von Ihnen geteilte Nachricht in einem Dialogfeld angezeigt wird.

Könnten Sie Ihre Browserkonsole öffnen und uns den Fehler mitteilen, den Sie möglicherweise sehen?


es scheint, als gäbe es keine Informationen über diesen Fehler in den Protokollen

Sie müssen sich die Konsolenprotokolle Ihres Browsers ansehen, nicht die Website /logs.

Ist das richtig?

forum.beginner.center/:1  Mixed Content: Die Seite unter 'https://forum.beginner.center/' wurde über HTTPS geladen, hat aber eine unsichere Schriftart 'http://forum.beginner.center/fonts/JetBrainsMono-Regular.woff2?v=0.0.19' angefordert. Diese Anfrage wurde blockiert; der Inhalt muss über HTTPS bereitgestellt werden.
forum.beginner.center/:1  Mixed Content: Die Seite unter 'https://forum.beginner.center/' wurde über HTTPS geladen, hat aber eine unsichere Schriftart 'http://forum.beginner.center/fonts/JetBrainsMono-Bold.woff2?v=0.0.19' angefordert. Diese Anfrage wurde blockiert; der Inhalt muss über HTTPS bereitgestellt werden.
app.js:270 ℹ️ Discourse v3.5.0.beta9-dev — https://github.com/discourse/discourse/commits/33dfd7dba9 — Ember v5.12.0
[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

[Nur melden] Weigerte sich, eine Zeichenfolge als JavaScript auszuwerten, da 'unsafe-eval' keine zulässige Quelle für Skripte in der folgenden Content Security Policy-Direktive ist: „script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'“.

analytics.eu.umami.is/script.js:1   Fehler beim Laden der Ressource: net::ERR_CONNECTION_CLOSED
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
Tracking Prevention blockierte den Zugriff auf den Speicher für <URL>.
deprecated.js:62  Hinweis zur Veralterung: Das Festlegen der Zeitzoneneigenschaft des Benutzerobjekts ist veraltet. Verwenden Sie stattdessen das user_option-Objekt [veraltet seit Discourse 2.9.0.beta12] [Entfernung in Discourse 3.0.0.beta1] [Veraltung-ID: discourse.user.userOptions]
a @ deprecated.js:62
security:1 Die Autofokus-Verarbeitung wurde blockiert, da ein Dokument bereits ein fokussiertes Element hat.
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 (Nicht autorisiert)
send @ jquery.js:9940
ajax @ jquery.js:9521
o @ ajax.js:188
(匿名) @ 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
(匿名) @ index.js:250
submit @ confirm-session.gjs:84
await in submit
(匿名) @ 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
(匿名) @ index.js:250
submit @ confirm-session.gjs:84
await in submit
(匿名) @ 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 „Gefällt mir“

Oh, hmm, das ist nützlich, aber 401er können aus den unterschiedlichsten Gründen ausgelöst werden. Ich werde das mit unserem zuständigen Passkeys-Experten klären.

1 „Gefällt mir“

Stellen Sie sicher, dass Ihre Website so konfiguriert ist, dass alles über HTTPS bereitgestellt wird. Die Überprüfung der Passkey-Herausforderung erfordert, dass alle Anfragen über HTTPS erfolgen. Außerdem muss die Domain zwischen Browser und Server exakt übereinstimmen. Wenn es irgendwo eine Diskrepanz gibt, schlägt die Überprüfung fehl.

Wir haben dafür eine Einstellung, force_https, die Sie ausprobieren können. Dies kann helfen (seien Sie jedoch vorsichtig, es kann Sie auch aussperren, wenn der Server nicht richtig konfiguriert ist).

2 „Gefällt mir“

Dies ist meine app.yml
Ich verwende einen Reverse-Proxy von OpenResty (basierend auf nginx)

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

Ich kann meine Website nicht über den HTTPS-Port 6443 erreichen

Deshalb habe ich nur den HTTP-Reverse-Proxy eingerichtet

Dies ist meine OpenResty-Konfiguration

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

Dies ist die Reverse-Proxy-Konfiguration

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

Hallo, kann mir jemand helfen?

Entschuldigen Sie die Verzögerung. Das Problem hängt tatsächlich mit Ihrem Proxy zusammen. Ich kann nicht genau sagen, was es ist, aber einer der Domainnamen, das Protokoll (http oder https) und der Port sind im Weg.

Passkeys überprüfen, ob das Frontend und das Backend auf derselben Domain, demselben Protokoll und demselben Port laufen. Wenn hier eine Nichtübereinstimmung vorliegt, erhalten Sie eine Fehlermeldung wie diese.

Können Sie im Rails CLI Folgendes versuchen:

DiscourseWebauthn.origin

und es mit der URL vergleichen, die Sie verwenden, um auf die Website im Browser zuzugreifen? Die beiden sollten übereinstimmen.

Benutzer-Passkey-Funktion funktionierte, als ich force https aktivierte

Referenz

2 „Gefällt mir“

Nach meinem Verständnis des Webauthn-Standards für Passkeys beruht dieser auf einer sicheren Verbindung zwischen der Relying Party (Discourse) und dem Client (Browser oder Mobilgerät) sowie dem Authenticator (z. B. einem Yubikey). Daher benötigen wir https für die Kommunikation, die von der Discourse-Anwendung ausgeht. Das Erzwingen von https mag die Lösung sein, aber auch nur ein Header für

proxy_set_header X-Forwarded-Proto https;

könnte ausreichen. Wenn das Erzwingen von https hilft (was ohnehin empfohlen wird), ist alles in Ordnung.

1 „Gefällt mir“

Ich weiß nicht, wie ich proxy_set_header X-Forwarded-Proto in app.yaml konfigurieren soll?