Sie können JWT-Token (JSON Web Token) programmgesteuert erstellen, indem Sie das JWT-Builder-Element in der Serverkonfiguration konfigurieren und
die com.ibm.websphere.security.jwt.JwtBuilder- und com.ibm.websphere.security.jwt.JwtToken-APIs in Ihren Anwendungen implementieren.
Informationen zu diesem Vorgang
Weitere Informationen zu JWT-APIs finden Sie in
der JSON-Web-Token-Java-Dokumenation oder in der API-Dokumentation, die im Lieferumfang des Produkts enthalten ist und im Verzeichnis ${wlp.install.dir}/dev bereitgestellt wird.
Vorgehensweise
Rufen Sie JWT-Token vom JWT-Tokengenerierungsendpunkt ab. - Rufen Sie Token von einem Endpunkt mit dem Feature jwt-1.0 ohne Programmieraufwand ab.
- Authentifizieren Sie Ihre Berechtigungsnachweise für den Zugriff auf den Endpunkt unter https://<host>:<port>/jwt/api/ibm/<configId>/token, wenn Sie in der Anforderung nicht bereits Berechtigungsnachweise eingeschlossen haben. Nach erfolgreicher Authentifizierung wird ein MP-JWT-Formattoken als JSON-Formular zurückgegeben. Das Token enthält den Benutzer und die Gruppen für den Benutzer gemäß des Datensatzes in der Benutzerregistry des Servers.
- Legen Sie andere Tokenattribute, wie z. B. Aussteller und Ablaufzeit, über die Attribute des JWTBuilder-Elements in der Datei server.xml mit der ID <configId> fest.
- Wenn Sie keine JWTBuilder-Elemente in der Datei server.xml definieren, verwenden Sie defaultJWT als <configId>-ID. Sie finden die verfügbaren Konfigurationsattribute für JWT-Builder unter jwtBuilder - JWT Builder
(jwtBuilder).
- Erstellen Sie JWT (JSON Web Tokens) in Liberty über das Programm.
- Fügen Sie der Datei server.xml das Feature jwt-1.0 hinzu.
<featureManager>
<feature>jwt-1.0</feature>
...
</featureManager>
- Konfigurieren Sie den JWT-Builder, indem Sie das jwtBuilder-Element ändern.
Weitere Informationen zu jwtBuilder-Attributen, die Sie konfigurieren können, finden Sie unter JWT Builder (jwtBuilder).
Wenn Sie das Feature
jwt-1.0 hinzugefügt und Ihre Änderungen gespeichert haben, fügt
Liberty das folgende
jwtBuilder-Standardelement hinzu.
<jwtBuilder id="defaultJWT">
</jwtBuilder>
In dieser Standardkonfiguration wird von den folgenden Standardwerten ausgegangen:
- Der exp-Anspruch ist 2 Stunden nach der Erstellungszeit des Tokens. Sie können diesen Wert über das expiry-Attribut konfigurieren.
- Der iss-Anspruch wird auf https://<Hostname>:<SSL-Port>/jwt/defaultJWT gesetzt. Konfigurieren Sie den Aussteller über das issuer-Attribut.
- Der JWT-Token wird mit dem Algorithmus RS256 mit einem privaten Schlüssel im Standardkeystore des Servers signiert. Bei dieser Konfiguration wird davon ausgegangen, dass für den Server ein Standardkeystore konfiguriert wird, dass der Standardkeystore einen einzelnen privaten Schlüssel enthält und dass der private Schlüssel zum Signieren verwendet werden kann. Wenn Sie einen anderen Keystore über das Attribut keyStoreRef angeben, wird der private Schlüssel aus dem angegebenen Keystore verwendet. Ist das Attribut keyAlias nicht konfiguriert und enthält der Keystore nur einen einzigen privaten Schlüssel, wird der private Schlüssel in der Signatur verwendet.
Sie können dieses jwtBuilder-Standardelement erneut konfigurieren, oder ein oder mehrere weitere jwtBuilder-Elemente erstellen. Jedes jwtBuilder-Element muss eine eindeutige, URL-konforme Zeichenfolge haben, die als id-Attribut angegeben wird. Wenn die ID fehlt, wird das
jwtBuilder-Element nicht verarbeitet.
Wenn das JWT-Token mit dem Algorithmus RS256 signiert wird, können Sie den JWT-Builder so konfigurieren, dass das JWT-Token mit JWK (JSON Web Key) signiert wird, indem Sie
jwkEnabled="true" festlegen. Wenn JWK aktiviert ist, generiert der JWT-Builder Schlüsselpaare dynamisch und signiert das JWT-Token mit dem privaten Schlüssel. Der JWT-Konsument kann zum Validieren der Signatur den Schlüssel aus der JWK-API abrufen. Das Format sieht wie folgt aus:
https://<Hostname>:<SSL-Port>/jwt/ibm/api/<jwtBuilder-Konfigurations-ID>/jwk
- Erstellen Sie JWT-Token programmgesteuert, indem Sie die com.ibm.websphere.security.jwt.JwtBuilder- und com.ibm.websphere.security.jwt.JwtToken-APIs in Ihre Anwendungen implementieren.
Weitere Informationen finden Sie in der JSON-Web-Token-Java-Dokumentation.
- Erstellen Sie ein JwtBuilder-Objekt.
Wenn Sie keine Konfigurations-ID angeben, wird das Objekt an die
jwtBuilder-Standardkonfiguration gebunden.
com.ibm.websphere.security.jwt.JwtBuilder jwtBuilder = JwtBuilder.create();
Wenn Sie eine Konfigurations-ID angeben, wird das Objekt mit der angegebenen ID an die
jwtBuilder-Konfiguration gebunden.
com.ibm.websphere.security.jwt.JwtBuilder jwtBuilder = JwtBuilder.create("jwtBuilder_configuration_id");
- Ändern Sie die Ansprüche im Token.
- Anspruch hinzufügen oder aktualisieren: jwtBuilder.claim("Name_des_Anspruchs",
"Wert_des_Anspruchs");
jwtBuilder.claim("role", "monitor");
- Anspruch löschen:
jwtBuilder.remove("Name_des_Anspruchs");
jwtBuilder.remove("role");
- Anspruch aus der eingebundenen Liberty-Benutzerregistry abrufen: jwtBuilder.fetch("Attributname");
Mit diesem Abrufaufruf wird das
JwtBuilder-Objekt aufgefordert, die eingebundene Benutzerregistry nach dem Benutzernamen zu durchsuchen, der über den sub-Anspruch des JWT-Tokens angegeben ist. Das JwtBuilder-Objekt ruft den Wert des angegebenen Attributs ab und erstellt einen neuen Anspruch basierend auf diesem Attribut. Der Name des neuen Anspruchs wird auf den Attributnamen und der Wert des neuen Anspruchs wird auf den Attributwert gesetzt.
- Anspruch aus einem vorhandenen JWT-Token oder JSON-Objekt kopieren: jwtBuilder.claimFrom(JSON_oder_JWT-Token,
"Name_des_Anspruchs");
- Ändern Sie den konfigurierten Signaturalgorithmus und den Signierschlüssel.
jwtBuilder.signWith("Neuer_Algorithmus", Neuer_Schlüssel);
- Erstellen Sie das Token mithilfe der API com.ibm.websphere.security.jwt.JwtToken.
JwtToken jwtToken = jwtBuilder.buildJwt();
String jwtTokenString = jwtToken.compact();
Beispiele für JWT-APIs
Das folgende Beispiel zeigt die Erstellung eines neuen JWT-Tokens.
JwtBuilder jwtBuilder = JwtBuilder.create();
jwtBuilder.subject("tom@op.com").claim(Claims.AUDIENCE, "https://acme.com/rs").claim("iss","https://sso.com/ibm/op" ).claim("scope", "impersonator monitor").claim("uid", "hasys123haksiqws");
JwtToken goToken = jwtBuilder.buildJwt();
Das daraus resultierende JWT-Token wird mit dem privaten Standardschlüssel des Servers signiert und enthält die folgenden Ansprüche.
{
"aud": "https://acme.com/rs",
"iss": "https://sso.com/ibm/op",
"iat": 1388440863, "exp": 1388444763,
"uid": "hasys123haksiqws",
"sub": "tom@op.com",
"scope": "impersonator monitor"
}
Das folgende Beispiel erstellt das JWT-Token
newToken aus einem anderen JWT-Token
goToken.
JwtToken newToken = JwtBuilder.create().claim(Claims.AUDIENCE, "https://acme.com/rs").claimFrom(goToken, "sub").claim(goToken, "uid").claim(goToken, "scope").buildJwt();