Skip to content
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

API-Zugriff auf Cevi-DB verwendet veralteten Mechanismus #9

Closed
carlobeltrame opened this issue Jan 20, 2022 · 5 comments
Closed

API-Zugriff auf Cevi-DB verwendet veralteten Mechanismus #9

carlobeltrame opened this issue Jan 20, 2022 · 5 comments
Assignees

Comments

@carlobeltrame
Copy link

Der User Import von hitobito (Cevi-DB) verwendet aktuell Personal Access Tokens: https://github.com/cevi/qualifikation/blob/e2d14113b145d4b59101427c7461a1946c6428e1/app/Http/Controllers/AdminUsersController.php#L111..L116

Diese Art von API-Zugriff hat diverse Drawbacks und Security-Probleme, und wurde deswegen letzten September von der hitobito-Community (konkret von Vertretern der CEVI, Pfadi, Jubla und SBV, also allen Organisationen welche Personal API Tokens in hitobito nutzen) für deprecated erklärt.

Der User Import sollte daher auf OAuth API Zugriff umgebaut werden, damit er langfristig weiter funktioniert. Voraussetzung dafür ist der OAuth-Login, welcher ja bereits in den upcoming changes aufgelistet ist. Beim Registrieren der OAuth Applikation in hitobito muss dann der api Scope eingetragen werden, dann kann das Quali-Tool im Namen des Users auf die hitobito-API zugreifen (also dasselbe tun wie bisher). OAuth-API-Zugriff ist sicherer als Personal API Tokens weil

  1. die Credentials der User nie ans Quali-Tool gegeben werden müssen
  2. das Zugriffstoken eine zeitlich begrenzte Lebensdauer hat
  3. die Credentials der User nicht aus Versehen in Webserver-Logs landen können

Eine fixe Deadline gibt es bisher nicht, wann die Personal API Tokens abgeschaltet werden, aber die mündliche Abmachung war, nach der Entscheidung von der Community letzten September mindestens ein Jahr Übergangsfrist zu bieten.

Falls ihr Hilfe beim Einrichten von OAuth oder OAuth API Zugriff braucht, helfe ich gerne aus. Ich habe den OAuth-Login auch bereits in der sehr ähnlichen Laravel-Quali-Applikation der Pfadi "Qualix" umgesetzt, wobei wir uns dort bei den Login-Features scheinbar etwas stärker auf die Laravel-Standards stützen als beim Cevi Quali-Tool, und darum Socialite verwendet haben.

@jeromesigg jeromesigg self-assigned this Jan 30, 2022
@jeromesigg
Copy link
Collaborator

Ich habe als Basis auch Laravel verwendet, somit wäre der Einsatz von Laravel Socialite auch möglich. Ich hatte bisher noch keinen Anhaltspunkt, wo ich beginnen soll, könnte aber natürlich mit der Vorlage von Qualix weitermachen.

@carlobeltrame
Copy link
Author

Cool, ja, habe ich gesehen dass ihr auch Laravel verwendet. Wenn du abschauen möchtest, schaust du (neben der exzellenten Laravel-Doku) am besten die Dateien an die im PR gloggi/qualix#87 geändert wurden, insbesondere HitobitoProvider.php. Aber am besten schaust du dir jeweils die aktuellste Version dieser Dateien an, statt die Änderungen im PR, weil ich noch diverse kleinere Verbesserungen seit dem ursprünglichen PR gemacht habe.

Falls du konkret irgendwo anstehst einfach melden.

@jeromesigg
Copy link
Collaborator

Mit der Hilfe des Qualix konnte ich es einbauen.
Danke vielmals. Es gibt vielleicht noch kleinere Korrekturen, aber die Grundfunktionialität steht schonmal.

@carlobeltrame
Copy link
Author

Sehr cool! Ich sehe du hast jetzt Service Tokens verwendet um die Daten aus der API abzurufen. Damit seid ihr abgesichert, die Abschaltung der Personal API Tokens wird euch nicht mehr tangieren. Finde ich auch eine gute Kompromisslösung, dass die Regionen die Service Tokens einmal eintragen und so den Import von TN für alle ihre Kurse ermöglichen. Du musst dir einfach bewusst sein dass damit neu mächtige langlebige Tokens bei dir in der Datenbank gespeichert werden. Falls ihr je ein Daten-Leak im Quali-Tool vermutet, solltet ihr dann unbedingt möglichst schnell all diese Service Tokens in hitobito löschen und durch neue ersetzen. Und das können dann ja nur Administrator/-innen und Mitglieder der Geschäftsstellen (auf Dachverband und bei Mitgliederorganisationen).

Hitobito würde theoretisch noch einen anderen Weg unterstützen: Jetzt wo OAuth Login bereits implementiert ist, könnte das Access Token (welches das Quali-Tool während dem OAuth Flow bekommt) für API-Zugang im Namen des eingeloggten Users verwendet werden. Kurze Dokumentation ist hier: https://github.com/hitobito/hitobito/blob/master/doc/development/08_oauth.md#accessing-the-json-api
Konkret müsste man dazu zum Beispiel folgende Schritte unternehmen:

  1. Für die OAuth-Applikation die neu für euch in der cevi-db eingetragen wurde müsste der "api" Scope aktiviert werden. Ein Scope bestimmt ja, wie viel Zugriff eine externe OAuth-Applikation (das Quali-Tool) auf die persönlichen Daten in hitobito hat. Bisher hast du die Scopes name und with_roles drin, was dem Quali-Tool erlaubt, den Namen und die Rollen der sich einloggenden Person abzurufen. Der api Scope erlaubt es dem Quali-Tool, im Namen des Users die JSON-API in hitobito zu benutzen. Dabei gelten dieselben Berechtigungsregeln, die sonst in hitobito im Browser auch gelten.
  2. In redirectToHitobitoOAuth und handleHitobitoOAuthCallback müsste der Scope api ergänzt werden, sodass hitobito weiss dass das Quali-Tool später vorhat, auf die API zuzugreifen und ein entsprechendes Zugangstoken ausstellen kann
  3. In findOrCreateSocialiteUser müsste das aktuelle kurzlebige Access Token auf dem User Model gespeichert werden
  4. Beim Import könnte man dann, anstatt ein Service Token im HTTP Header token zu senden, das gespeicherte OAuth Access Token im HTTP Header Authorization: Bearer <mein_access_token_vom_user_model> senden.

Das OAuth Access Token ist aber nur 2 Stunden lang gültig, daher müsste man dem User allenfalls sagen, dass er sich erneut einloggen soll und den Import nochmals probieren soll falls der Zugriff verweigert wird. Oder es könnte nach dem Login dem User gleich proaktiv vorschlagen, ob die TN importiert werden sollen. Oder es gäbe auch noch andere Wege wie man das ganz lösen könnte (einen weiteren OAuth-Flow durchmachen, was für den User komplett unbemerkbar sein sollte), aber das würde zu weit gehen um es jetzt in diesem Kommentar kurz zu beschreiben, weil man dann noch mit weiteren Callback URIs in hitobito und Callback Routen im Quali-Tool arbeiten müsste.

Falls du dich dafür entscheiden solltest, einen solchen Weg zu gehen helfe ich weiterhin gerne. Eine Beispiel-Implementation habe ich nur für die Deluxe-Variante (in einem noch offenen PR in einem anderen Tool basierend auf Symfony statt Laravel). Qualix selber interagiert bisher nicht mit der JSON API. Da das unmittelbare Problem mit der Abschaltung der Personal Access Tokens in hitobito gelöst ist, darfst du dieses Issue aber auch gerne schliessen.

@jeromesigg
Copy link
Collaborator

Danke vielmals für die Tipps, wir hatten den Weg über das API-Scope auch schon besprochen, aber waren der Meinung, dass für es sicherer wäre für den einen Aufruf ein Token zu erstellen, anstelle des API-Scope aufzuschalten.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants