oAuth2 / OIDC
Abgrenzung
Dieses Dokument wird sich nicht mit den allgemeinen Prinzipien von oAuth 2 & OIDC befassen. Dieses Thema wurde bereits mehrfach behandelt und eine eigene Dokumentation richtet am Ende mehr Schaden an als sie an Nutzen hat.
Wir sind weitestgehend Standardkonform und somit wird sich dieses Dokument nur mit den Ameise-Spezifischen Implementierungen beschäftigen, bzw. die Stellen aufgreifen in denen die OpenID Foundation Interpretationsspielraum lässt.
Wichtig
Wir empfehlen niemals die Authentifizierung selbst zu implementieren. Für (fast) jede Sprache gibt es zertifizierte Bibliotheken die regelmäßig aktualisiert werden. Eine eigene Implementierung wird in den Communities pauschal als unsicher angesehen. Sollte der Eindruck entstehen, dass keine der existierenden Bibliotheken den eigenen Use-Cases abdeckt, ist es das wahrscheinlichste, dass der Use-Case allgemein nicht durch oAuth2 / OIDC abgedeckt wird und sollte überdacht werden.
Konfiguration
Integration- / Testumgebung
Issuer / idP: https://auth.inte.dionera.dev
OIDC-Discovery: https://auth.inte.dionera.dev/.well-known/openid-configuration
Produktion
Issuer / idP: https://auth.dionera.com
OIDC-Discovery: https://auth.dionera.com/.well-known/openid-configuration
oAuth2 Clients
Die, den oAuth2-Clients allgemein zur Verfügung stehenden, technischen Möglichkeiten, werden in dem OIDC-Discovery-Dokument beschrieben.
Authentifizierung an den API's
Die Ameise API's erwarten den oAuth2-Access-Token als Bearer
im Authorization
-Header
Authorization: Bearer [oAuth2-Access-Token]
Autorisierung an den API's
Der User muss dem oAuth2 Client den Zugriff auf seine Ressourcen (scopes) gewähren, i.d.R stimmen diese mit der Aufgabe einer API überein. Welche scopes
für welche API benötigt werden, wird in den API-Beschreibungen ersichtlich.
Client Urls
Als Protokoll für Client-Uris unterstützen wir ausschließlich https.
Eine Ausnahmen machen wir für folgende Hostnamen in der Integration- / Testumgebung:
- localhost
- 127.0.0.1
- ::1
SPA - Empfehlung
Wir empfehlen für eine Single Page Application einen oAuth-Proxy zu verwenden, welcher zuständig ist den normalen authorization code flow abzuhandeln und den Access/Refresh Token serverseitig speichert.
App
Auch für Apps machen wir keine Ausnahme beim Protokoll. Die Client-Authorization-Method muss aber none
sein.
Scopes
Da das OIDC-Discovery-Dokument nur die Basis OIDC-Scopes aufführt, stellen wir hier eine vollständige Liste zur Verfügung:
Integration- / Testumgebung
https://id.inte.dionera.dev/.well-known/scopes
Produktion
https://id.dionera.com/.well-known/scopes
Claims
Im OIDC-ID-Token, bzw. in der oAuth2-Userinfo Route, stehen, je nach gewährten scopes
, neben den standardisierten Pflichtfeldern, folgende zur Verfügung:
claim | scopes | Beschreibung |
---|---|---|
sub | Ameise-Mitarbeiter-ID (alphanum, utf-8, max 40chars, case insensitiv) | |
locale | de-DE/AT je nach Land des Mandanten | |
name | profile | |
given_name | profile | |
family_name | profile | |
gender | profile | male/female, leer bei juristischen Personen |
picture | profile | Url zum Profilbild |
picture_id | profile | ID des Profilbilds falls andere Formate gewünscht werden |
address | address | Adressdaten |
- street_address | address | |
- postal_code | address | |
- locality | address | |
- country | address | de/at |
phone | phone | Mobilfunknummer |
broker | Daten des Vermittlers | |
- id | (alphanum, utf-8, max 40chars, case insensitive) | |
- parent_id | ID des übergeordneten Vermittlers | |
- root_id | ID des Hauptvermittlers (boolean) | |
- is_root | Dieser Vermittler ist ein Hauptvermittler | |
- name | profile | |
- logo | profile | falls vorhanden |
- logo_id | profile | Falls vorhanden und andere Formate für das Logo gewünscht werden |
client | Daten des Mandanten | |
- id | (alphanum, latin1, max 40chars, case sensitiv) | |
- country | de/at | |
ameise/permissions | ameise/permissions | Liste mit den Rechten aus der Ameise, z.B ['ameise', 'verwaltung', ...] |
client_id | deprecated | |
broker_id | deprecated |
ServiceAccount
Um die M2M-Kommunikation zu unseren oAuth2-API's zu ermöglichen unterstützen wir den urn:ietf:params:oauth:grant-type:jwt-bearer
grant type gemäß RFC7521.
Ein ServiceAccount ist ein JSON-Dokument welches von uns bereit gestellt wird und alle Informationen enthällt die benötigt werden um einen Access-Token abzuholen.
Dokument
Attribut | Beschreibung |
---|---|
version | zB. v1 |
id | |
issuer | |
token_endpoint | |
audience | |
grant_type | urn:ietf:params:oauth:grant-type:jwt-bearer |
sub | Ameise-Mitarbeiter-ID (alphanum, utf-8, max 40chars, case insensitiv) |
scope | freigegebene scopes (string[], zB. ["ameise.imports"]) |
jwk | PrivateKey im JSONWebKey-Format |
client_id | |
client_secret | |
created_at | DateTime |
expires_at | DateTime |
broker | Daten des Vermittlers |
- id | (alphanum, utf-8, max 40chars, case insensitive) |
- parent_id | ID des übergeordneten Vermittlers |
- root_id | ID des Hauptvermittlers (boolean) |
- is_root | Dieser Vermittler ist ein Hauptvermittler |
client | Daten des Mandanten |
- id | (alphanum, latin1, max 40chars, case sensitiv) |
Beispiel
(Platzhalter überwiegend aus dem ServiceAccount-Dokument)
Generiere ein JWS {jws}
:
Header
{
"alg": "ES512"
}
Payload
{
"iss": "{issuer}",
"sub": "{sub}",
"aud": "{audience}",
"iat": {UNIX_TIME_NOW()},
"exp": {UNIX_TIME_NOW() + 5},
"jti": "{UuidV4()}"
}
Signatur
ECDSASHA512(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
{jwk}
)
POST {token_endpoint}
Authorization: Basic {base64UrlEncode({client_id}:{client_secret})}
Content-Type: application/x-www-form-urlencoded
grant_type={grant_type}&assertion={jws}&scope={urlencode(scopes.join(" "))}
{"access_token":"IuDkPPqXKc6S90kMa9CL3amXxdeDXSwtMfUsH-Z_dHA.1DrDozmfeVIYcN3VdOaX4xHcM4Z-Tv8TR6iKAP3eJ4o","expires_in":3600,"scope":"scope1 scope2","token_type":"bearer"}
Warnung: Um nicht zu riskieren gesperrt zu werden, cache den Access-Token gemäß
expires_in
!Warnung: Denke rechtszeitig daran das ein ServiceAccount abläuft!
Warnung: Ein ServiceAccount sollte nur für eine Applikation verwendet werden!