1
votes

La personnalisation de la génération JWT ne fonctionne pas dans WSO2 APIM 3.1.0

J'ai essayé d'implémenter les étapes données dans la documentation WSO2 3.1.0 ( https://apim.docs.wso2.com/en/3.0. 0 / learn / api-gateway / pass-end-user-attributes-to-the-backend / passant-enduser-attributes-to-the-backend-using-jwt / ) pour personnaliser JWT.

Comme indiqué dans la documentation, j'ai créé la classe java du générateur JWT personnalisé, généré le fichier jar et l'ai placé dans le dossier WSO2 Home / repository / components / lib. A fait les configurations nécessaires dans deployment.toml pour activer JWT et redémarrer le serveur.

Lorsque je frappe une API avec le jeton de support, j'obtiens l'en-tête X-JWT-Assertion dans les journaux de carbone, mais lorsque je le décode, il ne contient pas les revendications personnalisées que j'ai ajoutées dans le générateur JWT personnalisé java classe.

Il contient les revendications standard comme indiqué dans l'image ci-dessous et non les revendications personnalisées qui ont été ajoutées (current_timestamp, message).

Besoin de suggestions à ce sujet car j'ai suivi les étapes indiquées dans la documentation.

 entrez la description de l'image ici


5 commentaires

Bonjour Suman, votre jar JWT Generator personnalisé est-il également déployé avec succès dans le dossier / repository / components / dropins?


Salut Tharika, j'ai placé le jar uniquement sous / repository / components / lib comme indiqué dans la documentation. Dois-je le placer également dans le dossier / repository / components / dropins?


Salut Suman, placer le pot sous les plugins devrait le déployer automatiquement sous le dossier dropins. Voyez-vous le pot dans le dossier dropins?


Salut Tharika, j'ai vérifié, après avoir placé le jar sous lib et après avoir redémarré le serveur, il entre également automatiquement dans le dossier dropins. Mais le problème est là et les revendications personnalisées n'apparaissent pas dans l'en-tête X-JWT-Assertion. Et vous avez mentionné le dossier plugins ci-dessus. Je suppose que vous parlez du dossier lib.


Salut Suman, oui désolé je parlais du dossier lib.


4 Réponses :


0
votes

J'ai essayé de reproduire ce scénario localement. Il était reproductible lorsque nous utilisons des jetons d'accès JWT pour appeler l'API.

Mais j'ai réussi à obtenir les revendications personnalisées dans l'en-tête X-JWT-Assertion lors de l'utilisation de jetons OAuth. Veuillez voir l'image ci-dessous.

 entrez la description de l'image ici

Vous devez suivre cette documentation pour effectuer la personnalisation lors de l'utilisation Jetons d'accès JWT pour appeler l'API.


6 commentaires

Salut Tharika, j'ai également importé le github.com/dsmohan/samples-apim/tree/master/CustomJWTGenerat‌ ou le projet dont vous avez dit qu'il fonctionne avec les jetons OAuth. J'ai généré le fichier jar, placé dans le dossier lib, puis j'ai appelé l'API avec le jeton OAuth et j'ai obtenu les revendications personnalisées. Merci pour les suggestions. Juste que maintenant, j'ai besoin de comprendre pourquoi le jar de code de jeton JWT ne fonctionne pas comme je l'ai déjà répondu.


Salut Tharika, la documentation que vous avez partagée ci-dessus pour le jeton d'accès jwt indique que le jar CustomJWTGenerator doit être placé sous / repository / components / dropins. Je ne sais pas s'il doit être placé dans les dropins en premier lieu ou sous le dossier lib. Une autre chose mentionnée est de définir apim.jwt.gateway_generator.impl sur le nom de votre classe dans le deployment.toml. Mais je n'ai pas trouvé du tout cette propriété dans deployment.toml. Dois-je l'ajouter explicitement. [apim.jwt.gateway_generator] impl = "org.wso2.carbon.test.CustomGatewayJWTGenerator"


Dans deployment.toml, je n'ai que ces propriétés liées à JWT. [apim.jwt] enable = true encoding = "base64" # base64, base64url generator_impl = "org.wso2.carbon.apimgt.keymgt.token.JWTGenerator" claim_dialect = " wso2.org/claims " header = "X-JWT-Assertion" signature_algorithm = "SHA256withRSA" enable_user_claims = true claims_extractor_impl = "org.wso2.carbon.apimgt.impl.token .DefaultClaimsRetriever "


Salut Suman, vous devez ajouter explicitement la propriété dans deployment.toml comme [apim.jwt.gateway_generator] impl = "org.wso2.carbon.test.CustomGatewayJWTGenerator". Vous pouvez ajouter le pot au dossier dropins.


Salut Tharika, puis-je également activer la propriété [apim.jwt] generator_impl = "org.wso2.carbon.apimgt.keymgt.token.JWTGenerator" également qui est présente par défaut et si oui, la valeur doit être conservée par défaut un ou doit être modifié en "org.wso2.carbon.test.CustomGatewayJWTGenerator"?


Salut Suman, ce JWTGenerator est différent de gateway_generator. Laissez donc la valeur par défaut telle quelle.



0
votes

J'ai suivi la documentation que vous avez partagée pour appeler l'API avec le jeton d'accès JWT. J'ai cloné le référentiel GIT donné dans le doc .: https://github.com / wso2 / samples-apim / tree / master / CustomGatewayJWTGenerator , a importé le code CustomGatewayJWTGenerator dans eclipse. Une fois l'importation réussie, j'ai pu voir une erreur de chemin de construction dans eclipse: joda-time-2.9.4.wso2v1.jar 'dans le projet' CustomGatewayJWTGenerator 'ne peut pas être lu ou n'est pas un fichier ZIP valide . Même si l'erreur a été vue dans eclipse, j'ai pu construire le pot en utilisant Maven. J'ai placé le fichier jar généré dans le dossier lib et après le redémarrage du serveur, j'ai vérifié que le fichier jar était également présent dans le dossier dropins. Mais d'une manière ou d'une autre, les revendications personnalisées que j'ai ajoutées dans la classe java CustomGatewayJWTGenerator n'apparaissent toujours pas dans l'en-tête X-JWT-Assertion. Est-ce quelque chose à voir avec l'erreur que j'ai eue dans eclipse après avoir importé le projet CustomGatewayJWTGenerator ou est-ce que je me trompe ailleurs?

La classe java CustomGatewayJWTGenerator: entrez la description de l'image ici

En-tête X-JWT-Assertion: entrez la description de l'image ici


3 commentaires

Salut Tharika, j'ai vérifié les journaux de carbone après le redémarrage du serveur avec le jar CustomGatewayJWTGenerator placé dans le dossier lib. J'ai trouvé une erreur liée à ce bocal et je pense que c'est à l'origine du problème. Aucune suggestion. Erreur que j'ai obtenue: ERREUR {org.wso2.carbon.apimgt.keymgt.util.APIKeyMgtDataHolder} - Une erreur se produit lors de l'initialisation de l'API KeyMgt Data Holder. La configuration par défaut sera utilisée.java.lang.ClassCastException: org.wso2.carbon.test .CustomGatewayJWTGenerator incompatible avec org.wso2.carbon.apimgt.keymgt.token.TokenGenerator


Cette erreur peut survenir si la classe du générateur personnalisé est définie de manière incorrecte dans deployment.toml


@TharikaMadurapperuma des pensées sur le prochain pointeur nul?



1
votes

J'ai conservé les propriétés et les valeurs JWT par défaut qui sont prédéfinies avec le produit telles quelles et j'ai ajouté celle que vous avez indiquée. Placé le jar CustomGatewayJWTGenerator dans le dossier dropins. Les propriétés JWT se présentent comme ci-dessous maintenant dans deployment.toml. Veuillez me faire savoir si les configurations ci-dessous sont correctes.

< [apim.jwt

enable = true

encoding = "base64" # base64, base64url

generator_impl = "org.wso2.carbon.apimgt.keymgt.token.JWTGenerator"

claim_dialect = "http://wso2.org/claims"

header = "X-JWT-Assertion"

signature_algorithm = "SHA256withRSA"

enable_user_claims = true

claims_extractor_impl = "org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever"

< [apim.jwt.gateway_generator

impl = "org.wso2.carbon.test.CustomGatewayJWTGenerator"

Redémarré le serveur et maintenant, lorsque je teste l'API avec le jeton d'accès JWT, l'invocation échoue et obtient une exception de pointeur nul. Les détails de l'erreur sont indiqués ci-dessous:

ERREUR {org.apache.synapse.transport.passthru.ServerWorker} - Erreur lors du traitement de la requête GET pour: /pizzashack/1.0.0/menu. java.lang.NullPointerException à org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.generateAndRetrieveJWTToken_aroundBody2 (JWTValidator.java:353) à org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.generateAndRetrieveJWTToken (JWTValidator.java:336) à org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.authenticate_aroundBody0 (JWTValidator.java:319) à org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.authenticate (JWTValidator.java:110) à org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator.authenticate_aroundBody4 (OAuthAuthenticator.java:334) à org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator.authenticate (OAuthAuthenticator.java:109) à org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate_aroundBody42 (APIAuthenticationHandler.java:419) à org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate (APIAuthenticationHandler.java:413) à org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest_aroundBody36 (APIAuthenticationHandler.java:349) à org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest (APIAuthenticationHandler.java:320) à org.apache.synapse.rest.API.process (API.java:367) à org.apache.synapse.rest.RESTRequestHandler.apiProcessNonDefaultStrategy (RESTRequestHandler.java:149) à org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI (RESTRequestHandler.java:95) à org.apache.synapse.rest.RESTRequestHandler.process (RESTRequestHandler.java:71) à org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage (Axis2SynapseEnvironment.java:327) à org.apache.synapse.core.axis2.SynapseMessageReceiver.receive (SynapseMessageReceiver.java:98) à org.apache.axis2.engine.AxisEngine.receive (AxisEngine.java:180) à org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler (ServerWorker.java:368) à org.apache.synapse.transport.passthru.ServerWorker.run (ServerWorker.java:189) à org.apache.axis2.transport.base.threads.NativeWorkerPool $ 1.run (NativeWorkerPool.java:172) à java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) à java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) à java.lang.Thread.run (Thread.java:813)


1 commentaires

Bonjour, avez-vous résolu ce problème? J'ai fait ce qui est dans les instructions et j'obtiens exactement la même erreur.



1
votes

Après quelques recherches, j'ai découvert qu'il s'agit d'un bundle OSGi qui fonctionne sur Apache Felix.

Veuillez vérifier l'importation suivante disponible dans un exemple de code ( CustomGatewayJWTGenerator ):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.wso2</groupId>
        <artifactId>wso2</artifactId>
        <version>1.2</version>
    </parent>
    <groupId>org.example</groupId>
    <artifactId>CustomGatewayJWTGenerator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>bundle</packaging>
    <dependencies>
        <dependency>
            <groupId>org.wso2.carbon.apimgt</groupId>
            <artifactId>org.wso2.carbon.apimgt.gateway</artifactId>
            <version>${carbon.apimgt.version}</version>
        </dependency>
        <dependency>
            <groupId>org.wso2.orbit.com.nimbusds</groupId>
            <artifactId>nimbus-jose-jwt</artifactId>
            <version>7.3.0.wso2v1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>3.2.0</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Name>${project.artifactId}</Bundle-Name>
                        <Export-Package>
                            la.foton.wso2.apim.custom.*
                        </Export-Package>
                        <Import-Package>
                            org.wo2.carbon.apimgt.gateway.*,
                            org.wso2.carbon.apimgt.impl.*
                            com.nimbusds.jwt.*,
                            *;resolution:=optional
                        </Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <properties>
        <carbon.apimgt.version>6.6.163</carbon.apimgt.version>
    </properties>
</project>


14 commentaires

Salut Emilio, j'ai utilisé les mêmes fichiers que vous avez partagés ci-dessus mais la construction du jar échoue lorsque l'emballage est laissé en tant que bundle. Cela a-t-il fonctionné pour vous?


Oui, cela a fonctionné. Essayez de cloner ce référentiel git, compilez et copiez le fichier jar dans dropins


Juste 'mvn install' et vérifiez le dossier cible pour le fichier JAR


Mise à jour de ma réponse avec le fichier pom.xml complet


Salut Emilio, j'avais cloné le même repo git auparavant. J'ai essayé à nouveau en changeant la valeur en "la.foton.wso2.apim.custom. *" Comme vous l'avez partagé ci-dessus à partir de "org.wso2.carbon.test. *". Lorsque j'essaye de construire à l'aide de maven, la construction échoue avec l'erreur: Le fichier JAR / ZIP (C: \ Users \ dabbiru.mohan \ .m2 \ repository \ org \ wso2 \ orbit \ joda-t‌ ime \ joda-time \ 2.9.4.‌ wso2v1 \ joda-time-2.9‌ .4.wso2v1.jar) semble corrompu, erreur: en-tête CEN invalide (mauvaise signature)


Il semble qu'il y ait un problème avec le fichier jar - "joda-time-2.9.4.wso2v1.jar".


Voici l'erreur complète: [ERROR] Impossible d'exécuter l'objectif org.apache.felix: maven-bundle-plugin: 3.2.0: bundle (default-bundle) sur le projet CustomGatewayJWTGenerator: Erreur lors du calcul du chemin de classe pour le projet MavenProject: org.example: CustomGatewayJWTGenerator: 1.0-SNAPSHOT @ C: \ Users \ dabbiru.mohan \ eclipse-workspace \ CustomGatewayJWTGen‌ erator \ pom.xml: Le fichier JAR / ZIP (C: \ Users \ dabbiru.mohan \ .m2 \ repository \ org \ wso2 \ orbit \ joda-t‌ ime \ joda-time \ 2.9.4.‌ wso2v1 \ joda-time-2.9‌ .4.wso2v1.jar) semble corrompu, erreur: en-tête CEN invalide (mauvaise signature)


Supprimez le dossier C: \ Users \ dabbiru.mohan \ .m2 \ repository \ org \ wso2 \ orbit \ joda-ti‌ me \ joda-time \ 2.9.4.w‌ so2v1 et réessayez ... Le package téléchargé semble être corrompu.


Vous pouvez supprimer ce dossier en toute sécurité car il s'agit du cache local Maven, il sera reconstruit automatiquement par script.


Salut Emilio, j'ai essayé en supprimant le dossier mentionné ci-dessus. Obtention de l'erreur: Le fichier JAR / ZIP (C: \ Users \ dabbiru.mohan \ .m2 \ repository \ org \ apache \ axis2 \ wso2‌ \ axis2-client \ 1.6.1-‌ wso2v40 \ axis2-client‌ -1.6.1-wso2v40.jar) semble corrompu, erreur: en-tête CEN invalide (mauvaise signature)


Il semble que le dépôt git n'a pas été cloné correctement. Je vais cloner à nouveau le repo et essayer.


Je ne pense pas que le problème se trouve dans le dépôt GIT, supprimez simplement le cache Maven entier, je veux dire, supprimez le répertoire C: \ Users \ dabbiru.mohan \ .m2 \ et réessayez.


Merci Emilio pour toute l'aide, j'ai supprimé le cache maven et cette fois, le jar a été construit avec succès et je reçois également les revendications personnalisées que j'ai ajoutées dans la classe CustomGatewayJWTGenerator. J'ai essayé en gardant la valeur comme "org.wso2.carbon.test. *" Et "la.foton.wso2.apim.custom. *" Ainsi. Dans les deux cas, cela fonctionne.


Super @Suman! En fait, définit uniquement quel package est visible par les appelants en dehors du bundle. Le "la.foton. *" Est mon exemple et dans ce cas, comme vous venez de télécharger un exemple depuis Github, je suppose qu'il devrait être "org.wso2.carbon.test. *". En résumé, lorsque vous créez votre propre package, assurez-vous de le déclarer dans pom.xml, afin que MANIFEST.MF soit une propriété générée.