当前位置: 首页 > 知识库问答 >
问题:

集成测试在OpenLiberty上通过JWT授权失败

甘明朗
2023-03-14

集成测试(生产代码运行良好)失败,同时请求RESTendpoint保护与@Role允许。抛出以下错误:

[5/20/19 8:44:21:363 CEST] 00000109 com.ibm.ws.security.jaspi.JaspiServiceImpl                   I CWWKS1652A: Authentication failed with status AuthStatus.SEND_FAILUR for the web request 
/banking/users/bed6109f-ef8a-47ec-8fa4-e57c71415a10. The user defined Java Authentication SPI for Containers (JASPIC) service null has determined that the authentication data is not valid.

项目基于JWT的OpenLiberty。不同之处在于UI部分。我的用户界面是基于Angular的,因此对于REST Endpoint以下的身份验证(JWT发布)使用:

@RequestScoped
@Path("/tokens")
@PermitAll
public class AuthResource {
    @Inject
    private SecurityContext securityContext;
    @Inject
    private AuthService authService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getJwt() {
        if (securityContext.isCallerInRole("USER") || securityContext.isCallerInRole("ADMIN")) {
            String name = securityContext.getCallerPrincipal().getName();
            AuthPojo authPojo = authService.createJwt(name);

            return Response.ok(authPojo).build();
        }

        return Response.status(Response.Status.UNAUTHORIZED).build();
    }
}

因此:

  1. UI(Angular)调用https://localhost:5051/tokens与Header授权:基本ENCODED_USERNAME_PASSWORD
  2. 后端在正文和标题中使用新生成的JWT令牌进行响应"Set-Cookie: LitpaToken2=SOME_TOKEN; Path=/; HttpOnly"
  3. UI将此令牌用于针对RESTendpoint的所有其他请求,这些endpoint注释为"@Role允许({"ADMIN","USER" })"

同样,在生产代码中,所有这些模式都运行良好,但集成测试失败。

以下是集成测试代码:

public class MyResourceIT {
    private static final String URL = "https://localhost:" +
        System.getProperty("liberty.test.ssl.port") + "/users/" + USER_ID1;

    private String authHeader;

    @Before
    public void setup() throws Exception {
        authHeader = "Bearer " + new JwtVerifier().createAdminJwt(USER_NAME1);
    }

    @Test
    public void getUserAndAccounts() {
        Response response = HttpClientHelper.processRequest(URL, "GET", null, authHeader);
        System.out.println("My URL: " + URL);
        System.out.println("My Header: " + authHeader);

        assertThat("HTTP GET failed", response.getStatus(), is(Response.Status.OK.getStatusCode()));
    }
}

看起来,返回401而不是200的问题是LtpaToken2 Cookie,该Cookie未在测试中设置。而是使用头“授权:承载JWT\U令牌”,但这不起作用。

我希望当提供标头授权:承载JWT_TOKEN时,由"@Role允许"保护的endpoint应以200响应。有没有一些技巧应该用饼干来做?

更新2019-05-23

这就是整个项目。示例测试位于此处。失败的测试将被忽略

    @Test
    public void getUserAndAccounts_withJwt_authorized() throws IOException {
        Response response = HttpClientHelper.processRequest(URL, "GET", null, authHeader, null);

        assertThat(response.getStatus(), is(Response.Status.OK.getStatusCode()));
    }

JWT令牌是在@Before注释方法的以下类中创建的:

    private String authHeader;
    @Before
    public void setup() throws Exception {
        authHeader = "Bearer " + new JwtVerifier().createAdminJwt(USER_NAME1);
    }

需要注意的是,该项目基于以下项目。

共有1个答案

松波
2023-03-14

由于CWWKS1652A消息是在没有提供程序名称的情况下发出的,这表明设置了appSecurity-3.0,并且至少通过注释或bean实现为应用程序配置了JSR-375(也称Java EE安全API规范)HttpAuthenticationMechanism。这会导致创建一个内部JASPIC提供程序,因此CWWKS1652A消息中的值为null,该提供程序调用已配置的HttpAuthenticationMechanism,该机制返回AuthStatus.SEND_失败状态。

请确保您打算使用HttpAuthenticationMechanism,并且在受到此机制质询时传递有效的身份验证凭据。

如果确定未配置HttpAuthenticationMechanism,则确定是否存在通过authconfigprovider.factory属性设置的外部JASPIC提供程序工厂(AuthConfigFactory实现)。在任何一种情况下,都是提供程序响应消息中显示的AuthStatus.SEND\u失败。

 类似资料:
  • 我在所有集成测试中不断收到异常,而单元测试运行良好。所有异常如下所示: 我正在使用Jupiter进行测试。我的观点的上述例外指向data.sql脚本,我必须填充一些数据。对我来说,语法似乎没问题,也运行良好,这意味着如果使用邮递员进行测试,会生成记录: 还考虑了Spring Boot可能存在的配置问题,所以我在gradle中添加了jdbc-starter依赖项。但它似乎仍然失败。 以下是测试的一部

  • 授权是允许访问那些只能被允许访问的人访问的资源的概念。授权测试意味着理解授权过程如何产生作用,并只用这些信息来绕过授权机制。 授权是一个接着成功认证后的过程,所以测试者首先必须验证已经有了一个合法的凭证和一些预设的角色和权限。在这类的评估测试中,应该验证是否能够绕过授权模式,找到一个路径遍历漏洞或发现提升权限的方法。 目录遍历/文件包含测试 (OTG-AUTHZ-001) 授权绕过测试 (OTG-

  • 我们正在使用JMeter对使用Azure AAD身份验证的门户进行负载测试,该门户目前因此问题而失败: {"error":"invalid_grant "," error _ description ":" aadsts 70008:提供的授权码或刷新令牌由于不活动已过期。为此用户和资源发送新的交互式授权请求。\ r \ n trace ID:e4af 3a 0a-84cc-4f7e-854 f-

  • 综述 这类测试注重于验证每个角色或访问限制文件的特权的授权模式是否良好实现。 对于评估中测试者拥有的每个不同角色,每个功能函数和应用在完成认证环节后的请求,都需要被验证: 未认证用户是否可以访问资源? 登出后是否可以访问资源? 不同角色或权限的用户是否可以访问功能函数和资源? 尝试用管理员用户来访问应用并追踪记录所有的管理功能。 普通权限用户是否可以访问管理功能? 那些拥有不同权限的用户是否可以使

  • 使用jacoco代理并获取测试覆盖率报告有大量答案。大多数答案都是一半,我有点困惑。 以下是我想做的:1。我的Java应用程序正在某个远程服务器上运行。说IP-192.168.17.7 我使用以下命令运行测试:mvn-Denv=stage-Dmaven。测验失败ignore=true-DsuiteFile=src/test/java/Smoke。xml测试 现在我如何通过使用Jacoco代理获得J

  • 当我录制一个浓缩咖啡测试并重播时,我收到这个错误,我该如何解决它?: junit.framework.AssertionFailedError:无法授予权限,请参阅logcat(位于Android.support.test.runner.permission.requester.requestPermission(permissionrequester.java:50)(位于Android.sup