自定义JWT生成在WSO2 APIM 3.1.0中不起作用

时间:2020-06-26 13:26:23

标签: wso2 jwt wso2-am

我尝试实施WSO2 3.1.0文档(https://apim.docs.wso2.com/en/3.0.0/learn/api-gateway/passing-end-user-attributes-to-the-backend/passing-enduser-attributes-to-the-backend-using-jwt/)中给出的自定义JWT的步骤。

如文档中所述,我创建了自定义JWT生成器java类,生成了jar,并将其放在WSO2 Home / repository / components / lib文件夹下。在deploy.toml中进行了必要的配置以启用JWT并重新启动服务器。

当我使用不记名令牌访问API时,会在碳记录中获取X-JWT-Assertion标头,但是当我对其解码时,它不包含我在自定义JWT生成器java中添加的自定义声明课。

它包含下图所示的标准声明,而不包含已添加的自定义声明(current_timestamp,消息)。

由于我已按照文档中给出的步骤进行操作,因此需要建议。

enter image description here

4 个答案:

答案 0 :(得分:1)

我保留了产品预定义的默认JWT属性和值,并添加了您所告诉的内容。将CustomGatewayJWTGenerator jar放在dropins文件夹中。 现在,JWT属性在Deployment.toml中如下所示。请让我知道下面显示的配置是否正确。

[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”

signing_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”

重新启动服务器,现在当我使用JWT访问令牌测试API时,调用失败并获得空指针异常。 错误详细信息如下所示:

错误 {org.apache.synapse.transport.passthru.ServerWorker}-处理针对/pizzashack/1.0.0/menu的GET请求时出错。 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 :(得分:1)

经过研究,我发现它是一个运行在Apache Felix之上的OSGi软件包。

请检查示例代码(CustomGatewayJWTGenerator)中可用的以下导入:

import org.osgi.service.component.annotations.Component;

另请参阅示例pom.xml。它添加了有关OSGi捆绑软件的一些信息:

这是重要的部分:

<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>
                org.wso2.carbon.test.*
            </Export-Package>
            <Import-Package>
                org.wo2.carbon.apimgt.gateway.*,
                org.wso2.carbon.apimgt.impl.*
                com.nimbusds.jwt.*,
                *;resolution:=optional
            </Import-Package>
        </instructions>
    </configuration>
</plugin>

如您所见,它将组件导出为OSGi。看到下面的我的pom.xml:

<?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>

我相信您只需要更改<Export-Package>中的软件包信息,将JAR文件复制到$APIM_HOME/repository/components/dropins并重新启动服务器即可。

请让我知道是否出现问题。如果可行,请将答案标记为正确,以帮助他人。 :)

答案 2 :(得分:0)

我试图在本地重现这种情况。当我们使用JWT访问令牌来调用API时,它是可重现的。

但是当使用OAuth令牌时,我能够在X-JWT-Assertion标头中成功获得自定义声明。请参见下图。

enter image description here

使用JWT访问令牌调用API时,您需要遵循this documentation进行自定义。

答案 3 :(得分:0)

我遵循了您共享的有关使用JWT访问令牌调用API的文档。我克隆了文档https://github.com/wso2/samples-apim/tree/master/CustomGatewayJWTGenerator中给出的GIT存储库,并将CustomGatewayJWTGenerator代码导入eclipse中。导入成功后,我会在eclipse中看到一个构建路径错误:无法读取项目'CustomGatewayJWTGenerator'中的 joda-time-2.9.4.wso2v1.jar' 。即使在eclipse中看到了错误,我仍然能够使用Maven构建jar。我将生成的jar放在lib文件夹中,并在服务器重新启动后验证jar也在dropins文件夹中也存在。但是不知何故,我在CustomGatewayJWTGenerator java类中添加的自定义声明仍然没有出现在X-JWT-Assertion标头中。导入CustomGatewayJWTGenerator项目后,我在eclipse中遇到了错误?或者我在其他地方出错了?

CustomGatewayJWTGenerator Java类: enter image description here

X-JWT-Assertion标头: enter image description here