Kunden-Webservice CustomerAPI
Einleitung
TeamSIP Web stellt den Kunden eine REST-Schnittstelle bereit, diese wird als Kunden-Webservice bezeichnet.
Für die Nutzung ist Benutzername und Kennwort erforderlich, die Funktionen können via Web abgefragt werden.
Funktionsübersicht mit swagger ui
Aktuelle Version der Schnittstelle ist v2.
Version v1 wird demnächst eingestellt.
Bitte stellen Sie baldmöglichst auf Version v2 der Schnittstelle um.
Die Dokumentation zur Version kann oben rechts in der Seite umgestellt werden.
Beispiel URLs
https://www.teamsip.com/customerapi/swagger-ui.html
https://www.teamsip.com/customerapi/swagger-ui/index.html?urls.primaryName=customer-api-v2
Benutzer anlegen
Für die Nutzung des Kunden-Webservice ist ein entsprechender Nutzer mit Kennwort erforderlich.
Dieser Benutzer wird in der Benutzerverwaltung in TeamsipWeb angelegt. Notwendig ist das Recht Kundenadmin mit Webservice-Zugriff:
Nutzung und Anmeldung
Zunächst ist es erforderlich, am Server ein Accesstoken anzufordern. Mit Hilfe eines Accesstokens ist es möglich die verschiedenen Requests des Kunden-Webservice CustomerAPI zu nutzen.
Ein Accesstoken hat eine zeitlich begrenzte Gültigkeit. Diese Dauer wird in der Response mitgeliefert; "expires_in:" 300
bedeuted, dass das Accesstoken 300 Sekunden (5 Min) gültig ist. Danach ist es erforderlich ein neues Accesstoken anzufordern.
Im Request 1 fordert man mit seinem Username und Password das Accesstoken und Refreshtoken an. Die serverurl
ist die Domain des Servers, also zum Beispiel www.teamsip.com .
OAuth-Request 1: Anmelden Oauth mit Username und Password:
Der erste Zugriff erfolgt mit Benutzer und Kennwort wie folgt, hiermit wird ein Access Token angefordert:
Beispiel mit Curl
curl --location --request POST 'https://{{serverurl}}/auth/realms/teamsip/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=cust-api' \
--data-urlencode 'username={{username}}' \
--data-urlencode 'password={{password}}'
Als Anwort erhält man diese Information:
Response (JSON-Format)
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIwVzhPazFFYlFydDVoclVYb1RQSFZxREIzWDhGSkJVY19QVEdvTmI5S2p3In0.eyJleHAiOjE2OTE1ODk0NDAsImlhdCI6MTY5MTU4OTE0MCwianRpIjoiMTVmYTExMWEtZTQ1OS00ODczLTlhNDktMTI0NzJlNTdkODIwIiwiaXNzIjoiaHR0cHM6Ly90cnVua2l4LWxiMS50ZWFtZm9uLmNvbS9hdXRoL3JlYWxtcy90ZWFtc2lwIiwic3ViIjoiYW1lX2N1c3RhZG1pbiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImN1c3QtYXBpIiwic2Vzc2lvbl9zdGF0ZSI6IjkzZjMwOTcxLWI2YjUtNDNjMi1hOWVjLTU5OGRkZDZiMTdlYSIsInNjb3BlIjoiIiwic2lkIjoiOTNmMzA5NzEtYjZiNS00M2MyLWE5ZWMtNTk4ZGRkNmIxN2VhIiwidWlkIjoiZjpiYjk1YjA3Zi1hMDVkLTRiZjEtYjczNS02NzcxZmU4ZTY5NjM6YW1lX2N1c3RhZG1pbiJ9.kiN2xUHT5YC5Kk_d_VQB4WTnl9VRuV4SRtA83Yifs6UPk9_I9m-7eXUcBmtzFr01iCZId4PwI0LEZTfxN_bQES9LHufLfikAxKPn5f0GP4b1ZugKsh0HTxWW1xC3ZcmExGBCX34dCXktW93TAAViZ2QRr-p_wwvbRK6fIhdKC9ntmXgySPrvSMzD1Tirutlh8M8f1xyJQRM5plIetwFhMgDgQhTYzw61aQ9HZ8T8Y0nBVX9ExyhNJiZ4kIcCREcxi33ye6kR8Kz4jmyS78MzXjcuzLIjRdlsN2989DBqDPknVnedLjK85r-UWeWYU5THVvbPKM1lqkxD1nZtOUmGFA",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJmYTc1OTdlOS0xNWE4LTQ3MzgtOTRiOS0zMjViYWYxOGUyN2QifQ.eyJleHAiOjE2OTE1OTA5NDAsImlhdCI6MTY5MTU4OTE0MCwianRpIjoiNmMwYjUxOGItZjk0Ny00NGNlLWFlOGMtMzVlZTU4ZTU3YzdjIiwiaXNzIjoiaHR0cHM6Ly90cnVua2l4LWxiMS50ZWFtZm9uLmNvbS9hdXRoL3JlYWxtcy90ZWFtc2lwIiwiYXVkIjoiaHR0cHM6Ly90cnVua2l4LWxiMS50ZWFtZm9uLmNvbS9hdXRoL3JlYWxtcy90ZWFtc2lwIiwic3ViIjoiYW1lX2N1c3RhZG1pbiIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJjdXN0LWFwaSIsInNlc3Npb25fc3RhdGUiOiI5M2YzMDk3MS1iNmI1LTQzYzItYTllYy01OThkZGQ2YjE3ZWEiLCJzY29wZSI6IiIsInNpZCI6IjkzZjMwOTcxLWI2YjUtNDNjMi1hOWVjLTU5OGRkZDZiMTdlYSJ9.PBEnlwmMGD7NUadNNq-LujxAgKBK8Yd6gE7TklsieJA",
"token_type": "Bearer",
"not-before-policy": 0,
"session_state": "93f30971-b6b5-43c2-a9ec-598ddd6b17ea",
"scope": ""
}
OAuth-Request 2: Anfordern neue Token mit Hilfe des Refreshtoken:
Ist ein Accesstoken abgelaufen (Man erhält einen HTTP-Error 401 zurück), fordert man mit Request 2 ein neues Tokenpaar aus Accesstoken und Refreshtoken an.
Dazu benötigt man nur das Refreshtoken aus dem jeweils letztem Oauth-Request.
Das Refreshtoken hat eine Gültigkeit von "refresh_expires_in": 1800
, also 30 min. Danach ist auch das Refreshtoken abgelaufen. In diesem Fall ist es wieder nötig sich mit Hilfe von OAuth-Request 1 ein neues Tokenpaar aus Accesstoken und Refreshtoken anzufordern.
Curl
curl --location --request POST 'https://{{serverurl}}/auth/realms/teamsip/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'client_id=cust-api' \
--data-urlencode 'refresh_token={{refresh_token des letzten Oauth-Requests}}'
Die Antwort lautet dann wie folgt:
Beispiel für die Response
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ6VGFaZDd0XzI3RU1jVmIweW5QcGVWOTNvMVpWNUtCc1h1Mmc0dWdYSmhjIn0.eyJleHAiOjE2OTE1OTM2OTQsImlhdCI6MTY5MTU5MzM5NCwianRpIjoiNTQzMTJhNjYtZTM1NS00ZjBlLTk2Y2ItYWVhOTFhMTM1ODUzIiwiaXNzIjoiaHR0cHM6Ly93d3cudGVhbXNpcC5jb20vYXV0aC9yZWFsbXMvdGVhbXNpcCIsInN1YiI6InNoYV93c190ZXN0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiY3VzdC1hcGkiLCJzZXNzaW9uX3N0YXRlIjoiMjMyY2IxMGMtZjJhOC00NWU2LWIwYzUtYzQ4NDkyZTRmMjJiIiwic2NvcGUiOiIiLCJzaWQiOiIyMzJjYjEwYy1mMmE4LTQ1ZTYtYjBjNS1jNDg0OTJlNGYyMmIiLCJ1aWQiOiJmOmJiOTViMDdmLWEwNWQtNGJmMS1iNzM1LTY3NzFmZThlNjk2MzpzaGFfd3NfdGVzdCJ9.fz2YMlq0Vl8JqthFatAYRd6jaU88OMMvPblBfX4jzROVWB7etlAXk2dMQO_auZ2t2SyiaGR_8eDEECEhZSxLvUrDD8KZBuAkMMb3_1Fk4Bp6ruO-N-zwUYj-E6tUEna4MnQWJtkH4pDghIlXzXG3NzoxFci1HEPy3sM67JjMqslS4hih5G-IWCioixags-dO9aSNOCHYTWlFWAHXO2_ih0xRRBvAsCf1-hhGO7tYkFJUSimLSRDCQOv8UmvnZ7TF_KJDhQwfuGwiOmdEnj2gcbyziJ290X-expkr0b3aCC-dOY_Eo2hm7oisqT-K6bOpU4_OltCt680R896efttqlg",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3N2MzN2FlZS03YjdkLTQyM2MtYjhkNC1iM2NjMGRmYWQ5NjMifQ.eyJleHAiOjE2OTE1OTUxOTQsImlhdCI6MTY5MTU5MzM5NCwianRpIjoiYzk2NWNiMDYtNjUxZC00NDgwLThkOGUtNGIzYWQwN2QzMjc4IiwiaXNzIjoiaHR0cHM6Ly93d3cudGVhbXNpcC5jb20vYXV0aC9yZWFsbXMvdGVhbXNpcCIsImF1ZCI6Imh0dHBzOi8vd3d3LnRlYW1zaXAuY29tL2F1dGgvcmVhbG1zL3RlYW1zaXAiLCJzdWIiOiJzaGFfd3NfdGVzdCIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJjdXN0LWFwaSIsInNlc3Npb25fc3RhdGUiOiIyMzJjYjEwYy1mMmE4LTQ1ZTYtYjBjNS1jNDg0OTJlNGYyMmIiLCJzY29wZSI6IiIsInNpZCI6IjIzMmNiMTBjLWYyYTgtNDVlNi1iMGM1LWM0ODQ5MmU0ZjIyYiJ9.u3DXgKTyg-i-tzOgUl1nW3Y6un4tXpES3fPjQeQx6vI",
"token_type": "Bearer",
"not-before-policy": 1668586590,
"session_state": "232cb10c-f2a8-45e6-b0c5-c48492e4f22b",
"scope": ""
}
Verwendung der Requests der CustomerAPI mit dem Accesstoken am Beispiel der Methode GET participants:
Nun kann man jede Methode der CustomerAPI aufrufen, indem man im RequestHeader die Authorization: Bearer {{access_token}} mitgibt
Curl
curl --location 'https://{{serverurl}}/customerapi/api/v1/participants' \
--header 'Authorization: Bearer {{access_token}}'
Allgemeine Informationen gibts es auch hier: https://auth0.com/docs/secure/tokens/access-tokens/use-access-tokens