أووث2 الأساسي - كابوس :-(

مرحباً يا رفاق،

أحاول إعداد OAUTH2 منذ يومين، ولدي مشاكل.

لقد قمت بتكوين كل شيء وفقًا لـ التوثيق، ولكنني أحصل على هذا طوال الوقت

(oauth2_basic) فشل المصادقة! invalid_scope: OmniAuth::Strategies::OAuth2::CallbackError, invalid_scope | نطاقات غير معروفة/غير صالحة
بدأت GET "/auth/failure?message=invalid_scope&origin=<censored>%2Flatest&strategy=oauth2_basic" لـ 10.153.107.106 في 2024-11-27 05:30:33 +0000
معالجة بواسطة Users::OmniauthCallbacksController#failure كـ HTML
  المعلمات: {"message"=>"invalid_scope", "origin"=>"<censored>/latest", "strategy"=>"oauth2_basic"}

تكويني في اللوحة (فيما يتعلق بالنطاقات) هو كالتالي:

مزود الهوية (IdP) مُكوّن كالتالي:

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

أوامر curl مفيدة، والتي يمكنني استخدامها للاختبار، أو مخرجات تصحيح أفضل (لقد قمت بالفعل بتفعيل خيار التصحيح الغني)؟

أصاب بالجنون بسبب هذا :frowning:

شكرًا وتحياتي!

WS

تحديث:

لقد قمت للتو بإعادة الخيارات إلى “scope” فقط

لكن لم ينجح الأمر :frowning:

إعجابَين (2)

لاحظت أن موفر الهوية الخاص بنا كان لديه النطاق خاطئ في واجهة المستخدم الخاصة به…

openId موجود في واجهة المستخدم
openid هو الصحيح :slight_smile:
خطوة أخرى، ولكن الآن أحصل على انتهاء مهلة

image

بعد هذه المكالمة


OAuth2 Debugging: request POST https://<myAuthProvider/auth/oauth2/realms/root/realms/<realm>/access_token

Headers:
--- !ruby/hash-with-ivars:Faraday::Utils::Headers
ivars:
  :@names:
    user-agent: User-Agent
    content-type: Content-Type
elements:
  User-Agent: Faraday v2.12.1
  Content-Type: application/x-www-form-urlencoded


Body:
---
client_id: <client-id>
client_secret: <client-secret>
grant_type: authorization_code
code: <code
redirect_uri: https://<myDiscourse>/auth/oauth2_basic/callback

ينتهي بـ

ولكن بما أن مكالمة التفويض التي حصلت على الرمز قد تمت، فلا يمكن أن تكون هناك مشكلة في الشبكة، أليس كذلك؟

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

عندما أقوم باستدعاء باستخدام curl

curl --request POST \
  --url https://<IdP address>/auth/oauth2/realms/root/realms/<realm>/access_token \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data client_id=<clientId> \
  --data client_secret=<secret> \
  --data grant_type=authorization_code \
  --data code=<code > \
  --data redirect_uri=https://<discourse>/auth/oauth2_basic/callback

من داخل حاوية disource docker أحصل على هذا

{
  "access_token": "<token>",
  "refresh_token": "<refresh_token>",
  "scope": "openid profile email",
  "id_token": "<censored>",
  "token_type": "Bearer",
  "expires_in": 7199
}

هل يمكن أن تكون هذه مشكلة بسبب هذا؟

image

هذه الحقول ليست في الاستجابة :frowning:

إعجابَين (2)

لا أحد؟ :frowning:

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

أنا مهتم جدًا بالموضوع لأنني أبحث عن مقدار الجهد الذي سيبذل في صفحة الخطاب الأولى الخاصة بحيّي ثم أتحرك تدريجيًا إلى مدارس أطفالي. أنا مثقل بالإشعارات من جميع المنصات المختلفة.
تقليل الاحتكاك بالصفحة أمر بالغ الأهمية لذا أود أن أقدم بعض المساعدة. أنا مبتدئ في لغة روبي لذا يمكنني فقط تقديم بعض الموارد التي وجدتها وأفكار حول الموارد.

ربما تكون قد نظرت بالفعل في هذا ولكن قد ترغب في التحقق من المستودع على جيت هاب لـ discourse-openid-connect

يحتوي المستودع على 37 مساهمًا وأتخيل أن أحدًا منهم سيكون قادرًا على مساعدتك في الإجابة على سؤالك.

آمل أن يساعد هذا لأن هذا سؤال رائع.

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

أهلاً @thecatfix،

يبدو واعدًا. سأجربه فورًا وأقدم ملاحظاتي في أقرب وقت ممكن.
للأسف ليس لدي وقت اليوم. ربما أتمكن من العمل عليه في عطلة نهاية الأسبوع.

شكرًا جزيلاً وعطلة نهاية أسبوع رائعة!

أهلاً،

لم أستطع الانتظار وقمت بتجربته اليوم، ولكن بطريقة ما أفسد فريق قسم إدارة أصول المؤسسة (EAM) هذا الاكتشاف. إنه لا يعمل وأحصل على مصادقة عميل غير صالحة - فشلت المصادقة على الرغم من أنني متأكد بنسبة 1000% من أن بيانات الاعتماد تعمل (تم اختبارها باستخدام cURL)
لذا عدت إلى البداية.

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


Faraday::TimeoutError (Net::ReadTimeout with #<TCPSocket:(closed)>)

وجدت هذا، وأنا فضولي لمعرفة ما إذا كان شيء كهذا ممكنًا أيضًا في Discourse؟

أنا لست خبيرًا في Ruby على الإطلاق، لذا سأحتاج إلى المساعدة.

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

هل تريد عرض حركة مرور HTTP الأولية أم القدرة على الانتقال إلى الكود؟

حركة المرور الأولية …

الطلبات المرسلة مع رؤوس وبيانات …

هل هذا ممكن بأي شكل من الأشكال؟

أسهل طريقة للقيام بذلك هي من داخل الحاوية؛ يمكنك اعتراض وطباعة الطلبات بين nginx و Discourse عن طريق الدخول إلى الحاوية وتشغيل:

apt-get update && apt-get -y install scapy
scapy

# في موجه scapy، الصق ما يلي:
class Callback:
  def __init__(self):
    self.last = None
  def prn(self, p):
    if p != self.last: # تلتقط pcap على واجهة lo مرتين
      self.last = p
      p.hide_defaults()
      print(repr(p)) # هذا السطر يطبع الحزمة، احتفظ به أو اتركه
      if scapy.packet.Raw in p.layers():
        try:
          print(p.load.decode())
        except:
          print(p.load)

sniff(filter="port 3000", iface="lo", prn=Callback().prn)
إعجاب واحد (1)

هذا أمر رائع، شكرًا لك… كنت أبحث بالضبط عن مثل هذه الأداة!

همممم… ولكن

يبدو أن discourse يتلقى رد الاتصال ثم…
حسب فهمي، يجب عليه بعد ذلك الاتصال بنقطة نهاية userinfo والحصول على معلومات المستخدم باستخدام الرمز المسترد، ولكنني أواجه خطأ HTTP 500


GET /auth/oauth2_basic/callback?code=_B1HRB1e6kZKc8nuGLkzGC8&iss=https%3A%2F%2F%3CmyAuthDomain%3E%3A443%2Fauth%2Foauth2%2Frealms%2Froot%2Frealms%2Fintranetrealm&state=544801ae7e8262ea1667ea7531487f28e83aae232d5182b4&client_id=eadaa55a-1697-494a-8fg5-bb1137c68caa HTTP/1.0
Host: <discourseHost>
X-Request-Start: t=1732956951.485
X-Real-IP: 10.111.101.84
X-Forwarded-For: 10.131.101.84
X-Forwarded-Proto: https
Connection: close
cache-control: max-age=0
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
sec-fetch-site: same-site
sec-fetch-mode: navigate
sec-fetch-user: ?1
sec-fetch-dest: document
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
referer: https://discourseHost/
accept-encoding: gzip, deflate, br, zstd
accept-language: de-DE,de;q=0.9
priority: u=0, i
cookie: lbwdn=01; win=teUNUPSc8oibB......

<
<IP  ihl=5 len=52 id=7742 flags=DF frag=0 ttl=127 proto=tcp chksum=0xdf83 src=127.0.0.1 dst=127.0.0.1 |
<TCP sport=3000 dport=33574 seq=271589520 ack=3955524768 dataofs=8 flags=A window=499 chksum=0xfe28 options=[('NOP', None), ('NOP', None), ('Timestamp', (3962821542, 3962821542))] |
<Raw  load='HTTP/1.1 500 Internal Server Error\r\nDate: Sat, 30 Nov 2024 08:55:53 GMT\r\nConnection: close\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 658\r\nX-Request-Id: 7f4bafa0-7590-4b9b-8b8d-70a4fa1ae6c5\r\nX-Runtime: 10.078459\r\n\r\n' |
HTTP/1.1 500 Internal Server Error
Date: Sat, 30 Nov 2024 08:55:53 GMT
Connection: close
Content-Type: text/html; charset=utf-8
Content-Length: 658
X-Request-Id: 7f4bafa0-7590-4b9b-8b8d-70a4fa1ae6c5
X-Runtime: 10.078459

.....

<
<IP  ihl=5 len=281 id=55898 flags=DF frag=0 ttl=127 proto=tcp chksum=0x2282 src=127.0.0.1 dst=127.0.0.1 |
<TCP sport=3000 dport=33530 seq=491394 ack=1852886175 dataofs=8 flags=PA window=507 chksum=0xff0d options=[('NOP', None), ('NOP', None), ('Timestamp', (3962823893, 3962816870))] |
<Raw  load='\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n  \u003ctitle\u003eOops - Error 500\u003c/title\u003e\n  \u003cmeta http-equiv="Content-Type" content="text/html; charset=utf-8"\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003ch1\u003eOops\u003c/h1\u003e\n    \u003cp\u003eThe software powering this discussion forum encountered an unexpected problem. We apologize for the inconvenience.\u003c/p\u003e\n    \u003cp\u003eDetailed information about the error was logged, and an automatic notification generated. We\\'ll take a look at it.\u003c/p\u003e\n    \u003cp\u003eNo further action is necessary. However, if the error condition persists, you can provide additional detail, including steps to reproduce the error, by posting a discussion topic in the site\\'s feedback category.\u003c/p\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n' |
<
<IP  ihl=5 len=52 id=15439 flags=DF frag=0 ttl=127 proto=tcp chksum=0xc172 src=127.0.0.1 dst=127.0.0.1 |
<TCP sport=33574 dport=3000 seq=3955524768 ack=271589749 dataofs=8 flags=A window=511 chksum=0xfe28 options=[('NOP', None), ('NOP', None), ('Timestamp', (3962831618, 3962831618))] |
<Raw  load='HTTP/1.1 500 Internal Server Error\r\nDate: Sat, 30 Nov 2024 08:55:53 GMT\r\nConnection: close\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 658\r\nX-Request-Id: 7f4bafa0-7590-4b9b-8b8d-70a4fa1ae6c5\r\nX-Runtime: 10.078459\r\n\r\n' |
<
<IP  ihl=5 len=710 id=7744 flags=DF frag=0 ttl=127 proto=tcp chksum=0xdcef src=127.0.0.1 dst=127.0.0.1 |
<TCP sport=3000 dport=33574 seq=271589749 ack=3955524768 dataofs=8 flags=PA window=512 chksum=0xbb options=[('NOP', None), ('NOP', None), ('Timestamp', (3962831618, 3962831618))] |
<Raw  load='<!DOCTYPE html>\n<html>\n<head>\n  <title>Oops - Error 500</title>\n  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n</head>\n<body>\n    <h1>Oops</h1>\n    <p>The software powering this discussion forum encountered an unexpected problem. We apologize for the inconvenience.</p>\n    <p>Detailed information about the error was logged, and an automatic notification generated. We\'ll take a look at it.</p>\n    <p>No further action is necessary. However, if the error condition persists, you can provide additional detail, including steps to reproduce the error, by posting a discussion topic in the site\'s feedback category.</p>\n</body>\n</html>\n' |
<!DOCTYPE html>
<html>
<head>
  <title>Oops - Error 500</title>
.....

في السجلات، تطبع هذه الأسطر

لقطة شاشة تعرض خطأ في الشبكة مع انتهاء المهلة، بما في ذلك رؤوس HTTP وتفاصيل الخطأ. (تم وصفه بواسطة الذكاء الاصطناعي)

يبدو لي أن ديسكورس (Discourse) يواجه صعوبة في التعامل مع الاستدعاء العكسي (callback)، وأحتاج الآن إلى فهم أعمق لما يحدث خلف الكواليس في ديسكورس (Discourse).

لا أحصل على أي تلميحات في السجلات على الرغم من تشغيل كل وضع تصحيح (debug mode) أعرفه.

هممم، أنا عالق حقًا في هذا الأمر وهو أمر محبط :frowning:

مرحباً يا رفاق،

لقد تقدمت كثيراً الآن :slight_smile:

كان الأمر يتعلق بالبنية التحتية الخاصة بنا لإدارة الأصول (EAM)…

الآن لدي المشكلة التالية، مع ذلك :smiley:

رمز معلومات المستخدم الخاص بي يبدو كالتالي:


{
  "company-i": "A1",
  "accounting-code": "5806",
  "given_name": "Mister",
  "family_name": "Bean",
  "name": "Mister Bean",
  "departmentnumber": "Covert Operations",
  "salutation": "Dude",
  "description": "Some description",
  "preferredlanguage": "DE",
  "inumber": "723jfio-7zwe8489",
  "employeenumber": "36484332",
  "employeetype": "BigCompany",
  "uid": "f57383",
  "adupn": "f57383@europe.bigcom.corp",
  "uniqueuid": "f57383",
  "uniqueuidq": "f57383",
  "loginname": "f57383",
  "email": "Mister.Bean@bigcom.corp",
  "sub": "f57383",
  "subname": "f57383"
}

وأحصل على هذا الخطأ في السجلات:


ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR:  null value in column "provider_uid" of relation "user_associated_accounts" violates not-null constraint
DETAIL:  Failing row contains (6, oauth2_basic, null, null, 2024-12-03 13:06:49.831182, {"name": "Mister Bean", "email": "Mister.Bean@bigcom.corp", "user..., {"token": "dszghsdhsdfoph", "expires": true, "expir..., {}, 2024-12-03 13:06:49.831362, 2024-12-03 13:06:49.831362).

يبدو أن Discourse غير قادر على تعيين الإجابة من نقطة نهاية معلومات المستخدم إلى أسمائها الداخلية.

لقد حاولت إعداد هذا عبر واجهة المستخدم:

ولكن ربما بشكل خاطئ.

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

شكراً وتحياتي،

WS

هل oauth2 json user id path مملوء؟

تأكد من تعيين هذه القيم: https://meta.discourse.org/t/configure-sign-up-and-log-in-with-auth0-using-the-oauth2-basic-plugin/64633#configure-discourse-3.

مرحباً،

شكراً على الرد.

يبدو أن مزودي الخدمة الخاص بي لا يرسلون حقلي provider_name و provider_uid، وبالتالي يحاول Discourse إنشاء الإدخال بدونهما ويتلقى انتهاك NotNull.
ولكن، أليس من مسؤولية المكون الإضافي (oauth2_basic) ملء هذه القيم (إذا لم تأتِ من موفر الهوية عن بُعد)؟
أتوقع شيئًا مثل

provider_name: “oauth2_basic”
provider_uid: “1234”

يُستخدم تلقائيًا مع كل تسجيل دخول للمستخدم… :frowning:

provider_name ثابت على oauth2_basic و provider_uid سيكون أي شيء تملأه في oauth2 json user id path.
ما عليك سوى تعيين إعداد الموقع هذا إلى المسار الخاص بالمعرف بناءً على ما يعيده الموفر الخاص بك. يستخدم المكون الإضافي هذا المسار JSON لملء provider_uid، لذا إذا كان فارغًا حاليًا أو مسارًا غير موجود، فستكون القيمة nil.
من ملف JSON الخاص بك أعلاه، يبدو أن القيمة يجب أن تكون sub.

إعجابَين (2)

لكنني فعلت ذلك…

أنت على حق، يجب أن يكون المسار “sub”، لكنني قمت بتكوينه هنا

انتظر … لقد كنت على حق بالفعل، وأنا غبي :frowning:

إعداد خاطئ…

لقد نجح الأمر الآن!

إعجابَين (2)

هل هناك طريقة لحفظ هذه الإعدادات في مكان ما؟ :smiley:
عمل نسخة احتياطية من إعدادات التكوين فقط؟

هل هي في قاعدة البيانات؟

هذا رائع.

يتم حفظ جميع إعدادات الموقع في قاعدة البيانات. بافتراض أن لديك وصولاً إلى وحدة تحكم Rails، يجب أن يعرض لك ما يلي قائمة بالإعدادات.

SiteSetting.where("name LIKE 'oauth2_%'").pluck(:name, :value)

يمكنك أيضًا إنشاء نسخة احتياطية.