OAUTH2 Grundkurs - ein Albtraum :-(

Hallo Leute,

ich versuche seit 2 Tagen, OAUTH2 einzurichten, und habe Probleme.

Ich habe alles gemäß der Dokumentation konfiguriert, aber ich bekomme die ganze Zeit Folgendes:

(oauth2_basic) Authentication failure! invalid_scope: OmniAuth::Strategies::OAuth2::CallbackError, invalid_scope | Unknown/invalid scope(s)
Started GET "/auth/failure?message=invalid_scope&origin=<censored>%2Latest&strategy=oauth2_basic" for 10.153.107.106 at 2024-11-27 05:30:33 +0000
Processing by Users::OmniauthCallbacksController#failure as HTML
  Parameters: {"message"=>"invalid_scope", "origin"=>"<censored>/latest", "strategy"=>"oauth2_basic"}

Meine Konfiguration im Board (bezüglich Scopes) sieht wie folgt aus:

Der IdP ist wie folgt konfiguriert:

Hat jemand einen Tipp, wie ich das etwas weiter debuggen kann:

Coole Curls, mit denen ich testen oder besser Debug-Ausgaben erhalten könnte (habe die erweiterte Debugging-Option bereits aktiviert)?

Ich drehe hier durch :frowning:

Danke und viele Grüße!

WS

UPDATE:

Habe die Optionen gerade wieder auf nur “scope” zurückgesetzt

aber es hat nicht funktioniert :frowning:

2 „Gefällt mir“

bemerkt, dass unser IdP den Scope auf seiner UI falsch gesetzt hatte…

openId ist auf der UI
openid ist der richtige :slight_smile:
einen Schritt weiter, aber jetzt bekomme ich einen Timeout
image
nach diesem Aufruf


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

endet mit


Aber da der Autorisierungsaufruf, der den Code erhalten hat, durchgelaufen ist, kann es kein Netzwerkproblem geben, oder?

1 „Gefällt mir“

Wenn ich den Aufruf mit einem Curl ausgebe

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

vom Inneren des Discourse-Docker-Containers erhalte ich dies

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

Kann das daran liegen?

image

Diese Felder sind nicht in der Antwort :frowning:

2 „Gefällt mir“

Niemand? :frowning:

1 „Gefällt mir“

Ich bin sehr an dem Thema interessiert, da ich den Aufwand für meine erste Diskussionsseite für meine Nachbarschaft recherchiere und dann nach und nach zu den Schulen meiner Kinder übergehe. Ich bin mit Benachrichtigungen von all den verschiedenen Plattformen überfordert.
Die Reduzierung von Reibungsverlusten auf der Seite ist entscheidend, daher möchte ich einige Hilfe anbieten. Ich bin ein Anfänger in Ruby, daher kann ich nur einige Ressourcen anbieten, die ich gefunden habe, und Ideen zu den Ressourcen.

Sie haben sich das vielleicht schon angesehen, aber Sie möchten vielleicht das Repository auf GitHub für discourse-openid-connect überprüfen

Das Repository hat 37 Mitwirkende und ich stelle mir vor, dass einer von ihnen Ihnen helfen kann, Ihre Frage zu beantworten.

Ich hoffe, das hilft, da dies eine großartige Frage ist.

1 „Gefällt mir“

Hallo @thecatfix,

sieht vielversprechend aus. Ich werde es sofort ausprobieren und so schnell wie möglich Feedback geben.
Leider habe ich heute keine Zeit. Vielleicht kann ich am Wochenende daran arbeiten.

Vielen Dank und ein schönes Wochenende!

Hallo,

ich konnte nicht warten und habe es heute getestet, aber irgendwie haben die Leute in unserer EAM-Abteilung diese Erkennung vermasselt. Es funktioniert nicht und ich bekomme ungültigen Client - Authentifizierung fehlgeschlagen, obwohl ich zu 1000 % sicher bin, dass die Anmeldedaten funktionieren (mit Curls getestet).
Also bin ich wieder am Anfang.

Das Interessante ist, dass ich die ganze Zeit einen TimeoutError für die Anfrage an den Autorisierungsendpunkt bekomme, und das ziemlich schnell.


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

Das habe ich gefunden, und ich bin neugierig, ob so etwas auch in Discourse möglich ist?

Ich bin überhaupt kein Ruby-Typ, also brauche ich Hilfe.

Ich möchte jede einzelne Anfrage debuggen, die auf der Discourse-Seite bearbeitet wird. Ist das möglich?
Ich habe auch darüber nachgedacht, einen lokalen Proxy zu installieren, um die Aufrufe abzufangen, aber bevor ich mich damit beschäftige, wollte ich fragen, ob es einfachere Methoden gibt :slight_smile:

Möchten Sie den rohen HTTP-Verkehr anzeigen oder in den Code einsteigen können?

Der Rohverkehr …

Anfragen, die mit Headern und Payload gesendet werden …

Ist das irgendwie möglich?

Der einfachste Weg, dies zu tun, ist von innerhalb des Containers aus. Sie können Anfragen zwischen Nginx und Discourse abfangen und drucken, indem Sie den Container aufrufen und Folgendes ausführen:

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

# Eingabeaufforderung von scapy, fügen Sie Folgendes ein:
class Callback:
  def __init__(self):
    self.last = None
  def prn(self, p):
    if p != self.last: # pcaps auf lo erfassen zweimal
      self.last = p
      p.hide_defaults()
      print(repr(p)) # diese Zeile druckt das Paket, behalten oder lassen Sie es
      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 „Gefällt mir“

Das ist riesig, danke… habe genau nach so einem Tool gesucht!

Hmmm… aber
es scheint, dass Discourse den Callback erhält und dann…
Meiner Meinung nach sollte es dann den userinfoendpoint kontaktieren und die Userinfo mit dem abgerufenen Code abrufen, aber ich bekomme einen 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......

<Ether  dst=00:00:00:00:00:00 src=00:00:00:00:00:00 type=IPv4 |<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))] |>
<Ether  dst=00:00:00:00:00:00 src=00:00:00:00:00:00 type=IPv4 |<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='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

.....

<Ether  dst=00:00:00:00:00:00 src=00:00:00:00:00:00 type=IPv4 |<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))] |>
<Ether  dst=00:00:00:00:00:00 src=00:00:00:00:00:00 type=IPv4 |<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>
.....

In den Logs werden diese Zeilen ausgegeben

Ein Screenshot, der einen Netzwerkfehler mit einem Timeout zeigt, einschließlich HTTP-Headern und Fehlerdetails. (Beschriftet von KI)

Meiner Meinung nach hat Discourse Probleme, mit dem Callback umzugehen, und ich bräuchte nun tiefere Einblicke, was hinter den Kulissen von Discourse passiert.

Ich erhalte keine Hinweise in den Protokollen, obwohl ich jeden Debug-Modus aktiviert habe, den ich kenne.

Hmmm, ich stecke hier wirklich fest und es ist frustrierend :frowning:

Hallo Leute,

Ich bin jetzt viel weiter :slight_smile:

Es hatte mit unserer EAM-Infrastruktur zu tun…

Jetzt habe ich aber das nächste Problem :smiley:

Mein Userinfotoken sieht so aus:


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

Und ich bekomme diese Fehlermeldung in den Logs:


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 scheint nicht in der Lage zu sein, die Antwort vom Userinfo-Endpunkt seinen internen Namen zuzuordnen.

Ich habe versucht, dies über die Benutzeroberfläche einzurichten:

aber wahrscheinlich falsch.

Könnte mir jemand einen Hinweis geben, wie ich das einrichten kann?

Danke und viele Grüße,

WS

Ist oauth2 json user id path ausgefüllt?

Stellen Sie sicher, dass diese Werte gesetzt sind: https://meta.discourse.org/t/configure-sign-up-and-log-in-with-auth0-using-the-oauth2-basic-plugin/64633#configure-discourse-3.

Hallo,

danke für die Antwort.

Es scheint, dass mein Anbieter die Felder provider_name und provider_uid nicht sendet, und daher versucht Discourse, den Eintrag ohne diese zu erstellen und erhält eine NotNull-Verletzung.
Aber liegt es nicht in der Verantwortung des Plugins (oauth2_basic), diese Werte zu füllen (wenn keine vom Remote-IdP kommen)?
Ich würde so etwas erwarten:

provider_name: “oauth2_basic”
provider_uid: “1234”

Automatisch bei jedem Benutzerlogin verwendet… :frowning:

Der provider_name ist auf oauth2_basic festgelegt und der provider_uid wäre alles, was Sie in oauth2 json user id path eingeben.

Sie müssen diese Site-Einstellung nur auf den Pfad der ID setzen, basierend darauf, was Ihr Anbieter zurückgibt. Das Plugin verwendet diesen JSON-Pfad, um den provider_uid zu füllen. Wenn er derzeit leer ist oder ein Pfad, der nicht existiert, ist der Wert nil.

Aus Ihrem obigen JSON geht hervor, dass der Wert sub sein sollte.

2 „Gefällt mir“

Aber das habe ich doch gemacht…

Du hast Recht, der Pfad sollte „sub“ sein, aber ich habe das hier konfiguriert

Moment mal … Du hattest tatsächlich Recht und ich war dumm :frowning:

Falsche Einstellung …

Es funktioniert jetzt!

2 „Gefällt mir“

Gibt es eine Möglichkeit, diese Einstellungen irgendwo zu speichern :smiley:
ein Backup nur der Konfigurationseinstellungen zu machen?

Sind sie in der Datenbank?

Das ist großartig.

Alle Website-Einstellungen werden in der Datenbank gespeichert. Wenn Sie Zugriff auf die Rails-Konsole haben, sollten Sie mit dem Folgenden eine Liste der Einstellungen sehen können.

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

Sie können auch einfach ein Backup erstellen.