Kalender REST API Berechtigungsproblem seit v3.103.1
-
Hallo Zusammen,
auf unserem Selfhosting wurde am Mittwoch 22.11. die v3.103.1 automatisch installiert.
Seit diesem Zeitpunkt funktioniert der Zugriff via REST Api auf die Kalender nicht mehr.Das hier ging am Vortag noch
GET https://tools.ref-nidau.ch/api/calendars/appointments {"calendar_ids":[2,79,62,70,78,32],"from":"2023-11-22","to":"2024-11-26"}
Seit dem Update kommt dieses hier zurück:
GET https://tools.ref-nidau.ch/api/calendars/appointments {"calendar_ids":[2,79,62,70,78,32],"from":"2023-11-22","to":"2024-11-26"} 403:Forbidden {"server":"Apache/2.4.56 (Debian)","strict-transport-security":"max-age=15552000; includeSubDomains","set-cookie":["ChurchTools_churchtools=xxxxxxxxxxxxxxxxxxxxx; expires=Thu, 23-Nov-2023 03:39:01 GMT; Max-Age=86400; path=/; secure; HttpOnly; SameSite=None"],"expires":"Thu, 19 Nov 1981 08:52:00 GMT","cache-control":"no-store, no-cache, must-revalidate","pragma":"no-cache"} {"message":"Forbidden to view calendars: [2,79,62,70,78,32].","translatedMessage":"Du darfst das Objekt \"Calendar[2,79,62,70,78,32]\" nicht sehen.","messageKey":"error.forbidden.view","args":{"model":"Calendar","id":"2,79,62,70,78,32"},"errors":[]}
Das Usertoken hat nicht geändert und wenn ich mich mit dem User interaktiv anmelde, dann habe ich auch da alle Berechtigungen...
Was wurde geändert, bzw. wie muss ich es machen damit es wieder funktioniert?
Wir verwenden die JS api von hier https://github.com/churchtools/churchtools-js-client in der aktuellen Version
-
@aschild
Mir fällt aktuell nicht ein was wir an dieser Stelle geändert haben sollen.
Du könntest ja mal testen dich mit dem User im Browser einzugeben und die Api über die Browser URL Zeile aufzurufen. Passiert dann das gleiche? -
@davidschilling Habe es nun auch versucht.
Wenn der User via benutername+PW angemeldet ist, dann funktioniert es, der User hat KalenderzugriffDann kann ich auch via
curl -X 'GET' \ 'https://tools.ref-nidau.ch/api/persons/1551/logintoken' \ -H 'accept: application/json' das Logintoken abrufen.
Aber wenn ich dann das zurück gegebene logintoken angebe, dann gibt es mir hier nur 3 Kalender aus, und das sind die die öffentlich einsehbar sind...
Scheint also ein Problem mit der Token Validierung zu sein
curl -X 'GET' \ 'https://tools.ref-nidau.ch/api/calendars' \ -H 'accept: application/json' \ -H 'Authorization: login-token-aus-obiger-rest-abfrage'
{ "data": [ { "id": 2, "name": "Gottesdienste", "nameTranslated": "Gottesdienste", "sortKey": 10, "color": "#f83a22", "isPublic": true, "isPrivate": false, "randomUrl": "xxxxxxxxxxxxx", "iCalSourceUrl": "", "campusId": null, "eventTemplateId": null, "meta": { "modifiedDate": "2015-02-13T23:00:00Z", "modifiedPid": -1 } }, { "id": 63, "name": "KUW", "nameTranslated": "KUW", "sortKey": 78, "color": "#92e1c0", "isPublic": true, "isPrivate": false, "randomUrl": "xxxxxxxxxxx", "iCalSourceUrl": "xxxxxxxxxxxxxxxxxxx", "campusId": null, "eventTemplateId": null, "meta": { "modifiedDate": "2023-11-23T23:09:30Z", "modifiedPid": 1 } }, { "id": 64, "name": "Anlässe & GD's auf Webseite", "nameTranslated": "Anlässe & GD's auf Webseite", "sortKey": 1500, "color": "#9fe1e7", "isPublic": true, "isPrivate": false, "randomUrl": "xxxxxxxxxxxx", "iCalSourceUrl": "xxxxxxx", "campusId": null, "eventTemplateId": null, "meta": { "modifiedDate": "2023-11-23T23:09:30Z", "modifiedPid": 1 } } ], "meta": { "count": 3 } }
-
@aschild Vorher waren wir auf v3.102.0 und dann direkt auf die v3.103.1
Ev. etwas in dem Zusammenhang
Changelog
- Die Endpunkte GET /calendars und GET /calendars/<id>/appointments können auch vom unauthentifizierten Benutzer aufgerufen werden.
Ich habe noch mit einem anderen user+token versucht, geht auch nicht....
-
@davidschilling Es scheint dass das Token seit dem Update nicht mehr gültig ist.
Bei allen anderen API aufrufen kommt die Meldung{"message":"Session expired!","translatedMessage":"Die Session ist abgelaufen, bitte logge dich erneut ein.","messageKey":"exception.unauthorized","args":[],"errors":[]}
Wie kann ich ein neues Token erstellen lassen? Den delete API Endpunkt gibt es da ja noch nicht.
Nach dem setzten eines neuen PW hat sich auch das Token verändert, funktioniert aber unverändert nicht.Supportticket ist erstellt.
-
@davidschilling So, nun haben wir das Problem isolieren können, nun brauche ich noch einen Tipp zur Lösung.
Wir verwenden eure JS library dazu, unter nodejs
Mit dem Code hier;const myCT= new ChurchToolsClient(); myCT.setCookieJar(axiosCookieJarSupport.wrapper, new tough.CookieJar()); myCT.setBaseUrl(config.site_url); myCT.setUnauthorizedInterceptor(config.auth_token); activateLogging();
Verhalten vor v3.103.1 bein Aufruf von GET /calendars/<id>/appointments
- Die JS library senden einen request ohne Login Token
- Rückgabe eines 401 codes, da nur für angemeldete User verwendbar
- Die JS library macht dann ein Retry mit dem login token und dann kommen die Einträge
Verhalten ab v3.103.1 bein Aufruf von GET /calendars/<id>/appointments
- Die JS library senden einen request ohne Login Token
- Rückgabe eines 403 codes, da keine Berechtigung für die privaten Kalender existiert
- Die JS library macht keinen Retry, da code 403 und nicht 401
Nun stellt sich mir die frage ich ich der Library sagen kann, dass immer das Logintoken mitgesendet werden soll?
-
@aschild ah ich hab eine Idee. Versuche mal den ersten Request nicht auf die Termin Api zu machen sondern auf
/api/whoami/only_allow_authenticated?only_allow_authenticated=true
.
Die Termin Api braucht nicht mehr unbedingt einen Login. Es werden dort jetzt im nicht eingeloggten Zustand die Rechte des öffentlichen Users benutzt. Das könnte mit dem Problem zusammenhängen.
Wenn du den ersten Request auf den whoami call gemacht hast müsstest du danach eine eingeloggte Session haben. -
@davidschilling Danke, ja, so funktioniert es.
const myCT= new ChurchToolsClient(); myCT.setCookieJar(axiosCookieJarSupport.wrapper, new tough.CookieJar()); myCT.setBaseUrl(config.site_url); myCT.setUnauthorizedInterceptor(config.auth_token); activateLogging(); /** Force login */ function preLogin() { myCT.get('/whoami?only_allow_authenticated=true').then(whoAmI => { // console.dir(whoAmI); // console.log(`Hello ${whoAmI.firstName} ${whoAmI.lastName}!`); }); } preLogin();
Und dann die normalen API calls und die gehen direkt mit dem Logintoken durch.
Wäre sicher für andere hilfreich wenn das im github repo auch so dokumentiert ist. -
@aschild ja, bzw. oder das das gar nicht nötig ist.
-
@aschild Ist vielleicht eine blöde Frage, aber warum gibt es denn diese Retry-Logik? Warum schickst du nicht gleich/immer den Login-Token mit?
-
@thommyb sagte in Kalender REST API Berechtigungsproblem seit v3.103.1:
@aschild Ist vielleicht eine blöde Frage, aber warum gibt es denn diese Retry-Logik? Warum schickst du nicht gleich/immer den Login-Token mit?
Wenn du mir sagst wie man das mit eurem JS client macht, dann her mit den Infos
In den anderen Clients (php etc.) wird das lgin token defaultmässig immer mitgesendet