Cevi.DB API
Die Cevi.DB bietet eine API, mit der Personen- und Gruppen-Daten aus der Datenbank ausgelesen werden können. Die API erlaubte es aber nicht, Daten in der Cevi.DB zu verändern. Es gibt zwei Methoden, um Daten automatisiert auszulesen. Beide sind hier kurz erklärt.
User-Tokens
Dies ist ein Token, dass persönlich ist. Das heisst, es hat den gleichen Zugriff (lesen) wie der Ersteller. Auf lange Sicht wird diese Art eventuell auch wieder abgeschaltet.
Service-Tokens
Dies ist die neue Version der Abfragen. Sie ändern momentan recht schnell, aus diesem Grund verweisen wir hier nur auf die "ofizielle" Dokumentation auf Github: [1]. Für die Service Tokens kann ganz genau eingestellt werden, welche Berechtigungen sie haben. Sie können auf einer Gruppe erstellt werden (auf der Gruppe im Menu oben auf "Api-Keys", https://db.cevi.ch/groups/GRUPPE/service_tokens)
API
Die API wird von beiden, User-Tokens und Service-Tokens verwendet. Die offizielle Dokumentation finded ihr auch auf Github: [2]. Untenstehend sind doch noch einige kurze Anleitungen und Informationen gesammelt. Sie sind für die User-Tokens geschrieben. Für den Gebrauch von Service-Tokens ändern sich die Endpunkte nicht, nur die Parameter ändern sich von
user_email=info@cevi.ch&user_token=AABBCC
hin zu
token=DDEEFF
Allgemeine Hinweise
Die Schnittstelle wird über POST- und GET-Anfragen angesteuert und verwendet JSON als Datenformat. Der Zugriff über die Schnittstelle erfordert die Zugangsdaten eines registrierten Benutzers. Die Rechte der Schnittstelle entsprechen dann denn Rechten des verwendeten Nutzers. Beim Login wird ein user token
generiert, das danach bei jeder Anfrage mitgesendet werden muss.
Tools
Spender-Tool des RV
Die API wird vom Spender-Tool des RVs verwendet. Das Tool ist in Python geschrieben und ist freie Software. Es kann von Github heruntergeladen werden.
Couvertgenerator
Das Tool cevi-versand erstellt nach einmaligem einrichten mit minimalem manuellen Aufwand PDFs um Couverts für den Versand zu drucken. Dafür verwendet es auch die API. Unter anderem kann man damit:
- Ein Cevi-Logo auf den Umschlag drucken.
- Personen die zusammen wohnen in ein gemeinsames Couvert bringen. Das bedeutet weniger Arbeit beim Verpacken.
- Fehlerhafte Einträge in der DB finden - beispielsweise warnt das Tool, wenn jemand in keiner Ortschaft wohnt.
- Cevinamen und dazugehörige Stufennamen aufdrucken. Das vereinfacht das verteilen, wenn man nicht alle Empfänger gut kennt.
- Aufdrucken wie viele Leiter/Teilnehmer im Umschlag sind. Das vereinfacht das verpacken, wenn man nicht alle Empfänger gut kennt.
cevi-versand ist open-source und gratis zu benutzen, aber Spenden werden geschätzt :)
Ablauf einer Abfrage
- Login-Anfrage mit Email und Passwort senden
- Aus Antwort
user token
auslesen - Anfrage für Gruppen- oder Personendaten senden (mit Email und
user token
) - Aus Antwort gewünschte Daten auslesen
Wichtig: Passwörter dürfen nicht hardcoded im Programmcode hinterlegt werden. Passwörter im Programmcode sind ein Sicherheitsrisiko. Soll ein Programm ohne Interaktion mit einem Benutzer ausgeführt werden, so kann das user token
im Programmcode hinterlegt werden. Gelingt es einem Angreifer, das Token auszulesen, so erhält er nur eingeschränkte Lese-Rechte. Ein gestohlenes Passwort würde ihm erlauben, sich mit den vollen Benutzerrechten des Besitzers einzuloggen. Bitte informiert cevidb(at)cevi.ch, wenn ihr ein Skript erstellt und ein user token
hinterlegt.
Erstes Login
Um sich anzumelden, muss ein POST-Request an https://db.cevi.ch/users/sign_in.json gesendet werden. Als Parameter müssen person[email]
und person[password]
übergeben werden.
Beispiele
Python:
1 import requests
2 email = "ceviname@cevi.ch"
3 passwort = "123456"
4 res = requests.post('https://db.cevi.ch/users/sign_in.json?person[email]='+email+'&person[password]='+passwort)
5 token = res.json()["people"][0]["authentication_token"]
Shell:
1 wget --post-data 'person[email]=ceviname@cevi.ch&person[password]=123456' -o result.json https://db.cevi.ch/users/sign_in.json
2 cat result.json
Wichtig: Damit die https-Verbindung klappt, müssen die CA-Zertifikate verfügbar sein. In Python kann die Zertifikatdatei mit dem verify Keyword-Argument der post-Funktion definiert werden.
User Token verwalten
Das user token
ist über mehrere Logins konstant. Dadurch kann das Token in Programmen hinterlegt werden, die ohne Benutzer-Interaktion funktionieren sollen. Um ein bestehendes Token zu löschen oder ein neues Token zu generieren, können folgende Anfragen verwendet werden:
Request Typ | URL |
---|---|
post | https://db.cevi.ch/users/token.json |
delete | https://db.cevi.ch/users/token.json |
Als Parameter müssen wie beim Login person[email]
und person[password]
übergeben werden.
Daten abfragen
Sobald das Authentication Token bekannt ist, können verschiedene Endpunkte abgefragt werden. Die URL entspricht dabei der URL im Browser, endet aber auf .json
Bei jeder Abfrage müssen zudem die Email-Adresse und das user token
mitgesendet werden. Dazu bestehen zwei Möglichkeiten:
- als URL-Parameter:
.json?user_email=ceviname@cevi.ch&user_token=123456
- als Headers:
X-User-Email: ceviname@cevi.ch, X-User-Token: 123456
undAccept: application/json
Weiter können weitere GET-Parameter (analog zur “richtigen” Cevi.DB) angehängt werden. Am besten führt man das Gewünschte in der Cevi.DB aus (zum Beispiel Sortieren nach Rollen) und kopiert die URL, ändert die Endung zu .json
.
Beispiele
Normale Abfrage mit Python:
1 import requests
2 # vor diesem Teil muss natürlich das Token ausgelesen und gespeichert werden
3 email = "ceviname@cevi.ch"
4 token= "1a2b3c"
5 res = requests.post('https://db.cevi.ch/groups/5/people.json?user_email='+email+'&user_token='+token)
6 data = res.json()["people"]
Normale Anfrage mit der Shell:
1 wget --header "X-User-Email: ceviname@cevi.ch" --header "X-User-Token: 1a2b3c" \
2 --header "Accept: application/json" https://db.cevi.ch/groups/5/people.json -O people.json
3 cat people.json
Anfrage mit Sortierung mit Python:
1 # nach Login, Variable token ist definiert
2 # gewünscht ist eine Sortierung nach Rollen
3 # der Teil sort=roles&sort_dir=asc sortiert nun nach den Rollen, die höchste (z.B. AL) ist dann auch im json-File zuerst drin.
4 res = requests.get('https://db.cevi.ch/groups/5/people.json?sort=roles&sort_dir=asc&user_email=ceviname@cevi.ch&user_token='+token)
5 data = res.json()['people']
Anfrage mit Rollenauswahl mit Python:
1 # nach Login, Variable token ist definiert
2 # gewünscht ist eine Sortierung nach Rollen und eine Auswahl (nur AL)
3 # der Teil sort=roles&sort_dir=asc sortiert nun nach den Rollen.
4 # der Teil filters[role][finish_at]=&filters[role][role_type_ids]=35&filters[role][start_at]=&name=&range=deep grenzt die Rollen ein.
5 res = requests.get('https://db.cevi.ch/groups/5/people.json?filters[role][finish_at]=&filters[role][role_type_ids]=35&filters[role][start_at]=&name=&range=deep&sort=roles&sort_dir=asc&user_email=ceviname@cevi.ch&user_token='+token)
6 data = res.json()['people'] #ist hier leer, da auf der Geschäfsstelle (Gruppe 5) keine Abteilungsleiter erfasst sind.
Endpunkte
Endpunkt | URL | Beispiel (gid=1, pid=2, eid=3) |
---|---|---|
Gruppen <gid>
|
https://db.cevi.ch/groups/<gid>.json | https://db.cevi.ch/groups/1.json |
Personen in Gruppe <gid>
|
https://db.cevi.ch/groups/<gid>/people.json | https://db.cevi.ch/groups/1/people.json |
Details zu Person <pid>
|
https://db.cevi.ch/groups/<gid>/people/<pid>.json | https://db.cevi.ch/groups/1/people/2.json |
Events <eid>
|
https://db.cevi.ch/groups/<gid>/events/<eid>/participations.json | https://db.cevi.ch/groups/1/events/3/participations.json |
Über den Events-Endpunkt können auch die Fragen, welche beim Anlass/Kurs erfasst sind, abgefragt werden. Diese sind im json zu finden.
Hinweis: Wird versucht ohne Gruppen-Angabe auf eine Person zuzugreifen (https://db.cevi.ch/people/<pid>.json
) so wird die Anfrage auf die Hauptgruppe der Person weitergeleitet. Allerdings wird bei dieser Weiterleitung der Query-String ignoriert, so dass ein 401 Authorization Required
Fehler resultiert. Aus der Fehlermeldung kann jedoch die korrekte URL bestimmt werden.