-
-
Notifications
You must be signed in to change notification settings - Fork 1
Implement Login über OIDC #22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
Beim lokalen Testen klappt der Login bei mir nicht, stattdessen bekomme ich habe ich da was vergessen? |
Ne eigentlich nicht. Ich habe das eigentlich auch mit meinem eigenen Keycloak getestet, wo der Teil funktioniert hat. Hast du die Response irgendwie gemocked oder was nutzt du als OpenID provider zum testen? |
|
Ich hab das mit unserem keycloak getestet😅 |
|
Das ist.. ähmm.. interessant 😅 Ich habe mal ein bisschen rumgegoogelt diesen StackOverflow gefunden. Ansonsten hier einmal eine exportierte keycloak client config, die bei mir funktioniert (musst du nicht importieren aber, wenn du in Keycloak in den Client Einstellungen oben rechts auf Action -> Export drückst kannst du ja mal vergleichen). Und hier nochmal der Teil der app config.json, der dazu gehört: |
|
Ah, so komme ich weiter. Wenn ich jetzt als Scope openid requeste bekomme ich zumindest keinen Serverfehler mehr zurück, aber ein |
|
Supi das ist soweit erwartet. Ich wusste wie gesagt nicht, wie dieses |
|
Eventuell fehlt hier noch eine config-Variable für die Zuweisung welches Attribut aus Keycloak richtig ist? |
|
Das Flask-Login ist sehr agnostisch über sein Environment. Es braucht irgendeine Sammlung von User-Objekten, die von UserMixin erben und benutzt Decorators um diese Sammlung zu verwalten. Bisher so: Lines 48 to 52 in 448bbb0
Laden: Lines 41 to 46 in 448bbb0
Da verwenden wir bisher direkt die Daten, wie sie flask_ldap3_login ausgibt. Im Prinzip kann das User-Objekt, da das Passworttool und seine Daten sonst nirgends von Relevanz sind, das User-Objekt neu gestalten und auch die dekorierten Funktionen für den user_loader und save_user festlegen. Für die App relevant ist ein Name und die hinterlegte Mailadresse. Das sollte im Prinzip aus dem Auth rausfallen und dann sowas ermöglichen class User(UserMixin):
def __init__(self, oidc_id_token):
self.id = oidc_id_token.sub
self.username = …Oder aber, da wir hier ohnehin lokal nichts persistentes brauchen, ohne Flask-Login arbeiten und schlicht die relevanten Daten (Name und Mailadresse) aus dem id_token in die flask_session - und statt @login_required anhand der Inhalt der Session unterscheiden. Da Flask-Session mit signed cookies arbeitet, sollte das safe genug sein. |
closes #16
Wie erwähnt implementiere ich in dieser PR login mit OpenidConnect.

Das Login-Formular sieht nun dadurch so aus:
Zusätzlich habe ich noch implementiert, dass die flash-messages jetzt die kateogrien
info,warningunderrorin unterschiedlichen farben anzeigen, weil ich die nutze, wenn der openid login aus Gründen nicht funktioniert.Implementationsdetails:
/logindas erste mal aufgerufen wird (app.py:90)config.jsoneingelesen werden.OIDC_ISSUERz.B.https://auth.example.com/realms/queerlexikonfür Keycloak. Hieraus wird automatisch das Openid Autokonfigurations-Dokument abgerufen, um die verschiedenen openid endpoints zu entdecken.OIDC_CLIENT_IDOIDC_CLIENT_SECRETOIDC_SCOPEdefaulted aufopenidund ist der scope, der vom openid issuer requested wird.login_oidc_callback(app.py:67). Da ich mir nicht ganz sicher war, wie dasusers = {}dictionary befüllt wird, aus demload_user()das user objekt läd, kann es sein, dass der Teil entsprechend nicht richtig funktioniert (app.py:78). Insbesondere, wenn die Keycloak IDs nicht die gleichen sind, wie die, die hier alsidbezeichnet werden kann das noch kaputt sein.