خطأ عند إنشاء passkey للمستخدم في المتصفح

عندما أحاول إنشاء مفتاح مرور على موقعي الخاص، يظهر لي التذكير التالي:

انتهت مهلة عملية تسجيل مفتاح المرور، أو تم إلغاؤها، أو غير مسموح بها

لكن يمكنني إنشاء مفتاح مرور على منتدى Discourse Meta في نفس المتصفح (Microsoft Edge) ونفس المكون الإضافي (Apple Passkey).

لقد قمت بترقية Discourse إلى أحدث إصدار، لكنه لا يعمل مثل هذا المنشور.

يبدو أننا نعرض خطأ في وحدة التحكم عندما تظهر هذه الرسالة التي تشاركها في مربع حوار.

هل يمكنك فتح وحدة تحكم المتصفح الخاص بك ومشاركة الخطأ الذي قد تراه معنا؟


يبدو أنه لا يوجد شيء عن هذا الخطأ في السجلات

ستحتاج إلى الاطلاع على سجل وحدة تحكم المتصفح لديك، وليس سجلات الموقع.

هل هذا صحيح؟

forum.beginner.center/:1  محتوى مختلط: تم تحميل الصفحة على 'https://forum.beginner.center/' عبر HTTPS، ولكنها طلبت خطًا غير آمن 'http://forum.beginner.center/fonts/JetBrainsMono-Regular.woff2?v=0.0.19'. تم حظر هذا الطلب؛ يجب تقديم المحتوى عبر HTTPS.
forum.beginner.center/:1  محتوى مختلط: تم تحميل الصفحة على 'https://forum.beginner.center/' عبر HTTPS، ولكنها طلبت خطًا غير آمن 'http://forum.beginner.center/fonts/JetBrainsMono-Bold.woff2?v=0.0.19'. تم حظر هذا الطلب؛ يجب تقديم المحتوى عبر HTTPS.
app.js:270 ℹ️ Discourse v3.5.0.beta9-dev — https://github.com/discourse/discourse/commits/33dfd7dba9 — Ember v5.12.0
[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

[Report Only] تم رفض تقييم سلسلة نصية كـ JavaScript لأن 'unsafe-eval' ليس مصدرًا مسموحًا به للبرامج النصية في توجيه سياسة محتوى JavaScript التالي: "script-src 'nonce-4YvvTZffYuqGaENC8DnQ7yeNg' 'strict-dynamic'".

analytics.eu.umami.is/script.js:1   فشل في تحميل المورد: net::ERR_CONNECTION_CLOSED
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
منع التتبع من الوصول إلى التخزين لـ <URL>.
deprecated.js:62  إشعار بالتقادم: تم تقادم تعيين خاصية المنطقة الزمنية لكائن المستخدم. استخدم كائن user_option بدلاً من ذلك [متقادم منذ Discourse 2.9.0.beta12] [إزالة في Discourse 3.0.0.beta1] [معرف التقادم: discourse.user.userOptions]
a @ deprecated.js:62
security:1 تم حظر معالجة التركيز التلقائي لأن المستند لديه بالفعل عنصر مركز.
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 (غير مصرح به)
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)

أوه، هذا مفيد، لكن يمكن أن تحدث أخطاء 401 لأسباب لا حصر لها. سأتحقق مع خبير مفاتيح المرور المقيم لدينا.

إعجاب واحد (1)

هل يمكنك التأكد من أن موقعك مهيأ لتقديم كل شيء عبر https؟ يتطلب التحقق من تحدي مفتاح المرور أن تتم جميع الطلبات عبر https. أيضًا، يجب أن يتطابق النطاق بين المتصفح والخادم تمامًا. إذا كان هناك عدم تطابق في مكان ما، فسيفشل التحقق.

لدينا إعداد لهذا الغرض، force_https، يمكنك تجربته، فقد يساعد (على الرغم من توخي الحذر، فقد يؤدي أيضًا إلى قفل حسابك إذا لم يتم تكوين الخادم بشكل صحيح).

إعجابَين (2)

هذا هو app.yml الخاص بي
أنا أستخدم وكيل عكسي بواسطة OpenResty (يعتمد على nginx)

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

لا يمكنني استخدام موقعي عبر منفذ https 6443

لذلك قمت فقط بتعيين وكيل عكسي لـ http

هذا هو إعداد 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;
}

هذا هو إعداد الوكيل العكسي

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

مرحباً، هل يمكن لأحد مساعدتي؟

عذرًا على التأخير. المشكلة هنا تتعلق بالفعل بالخادم الوكيل (proxy) الخاص بك. لا يمكنني تحديد ماهيتها بالضبط، ولكن أحد أسماء النطاقات أو البروتوكول (http أو https) أو المنفذ يسبب المشكلة.

تتحقق Passkeys من أن الواجهة الأمامية والخلفية تعملان على نفس النطاق والبروتوكول والمنفذ. إذا كان هناك عدم تطابق في أي من هذه، فستحصل على خطأ كهذا.

في سطر أوامر Rails، هل يمكنك تجربة هذا:

DiscourseWebauthn.origin

ومقارنته بعنوان URL الذي تستخدمه للوصول إلى الموقع في المتصفح؟ يجب أن يتطابق الاثنان.

تم تشغيل وظيفة مفتاح المرور للمستخدم عند تمكين فرض https

مرجع

إعجابَين (2)

على حد فهمي لمعيار Webauthn لـ Passkey، فإنه يعتمد على اتصال آمن بين الطرف الموثوق به (Discourse) والعميل (المتصفح أو الجهاز المحمول) والمصادق (مثل yubikey). وبالتالي نحتاج إلى https للاتصال القادم من تطبيق Discourse. قد يكون فرض https هو الحل، ولكن مجرد ترويسة لـ

proxy_set_header X-Forwarded-Proto https;

قد يكون كافياً أيضاً. إذا كان فرض https يساعد (وهو ما يوصى به على أي حال)، فكل شيء على ما يرام.

إعجاب واحد (1)

لا أعرف كيفية تكوين proxy_set_header X-Forwarded-Proto
في app.yaml؟