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

在Java EE/Jersey中为生成的Swagger UI添加承载令牌字段

芮叶秋
2023-03-14

我有一个Java EE8应用程序,在该应用程序中,我使用OpenAPI注释来定义RESTendpoint,并自动生成一个昂首阔步的UI。对于身份验证,我使用JSON Web令牌(JWT)。

当我从邮递员发送请求时,一切都很好,但是,我不知道如何在我的昂首阔步的UI中添加一个承载令牌的字段。

我使用@securityscheme注释定义我的安全方案:

@SecurityScheme(
        securitySchemeName = "JWT",
        description = "JWT authentication with bearer token",
        type = SecuritySchemeType.HTTP,
        scheme = "bearer",
        bearerFormat = "Bearer [token]"
)
public class ApplicationConfig extends Application {

}

我尝试将此方案作为@securityrequirement添加到资源的@openapidefinition注释中,并直接添加到方法中。

@Path("/items")
@OpenAPIDefinition(
        info = @Info(title = "Items resource", version = "v1"),
        security = @SecurityRequirement(name = "JWT")
)
@Transactional(value = TxType.REQUIRES_NEW)
@Interceptors({RolesAllowedInterceptor.class})
@SecurityScheme(
        securitySchemeName = "JWT",
        description = "JWT authentication with bearer token",
        type = SecuritySchemeType.HTTP,
        scheme = "bearer",
        bearerFormat = "Bearer [token]"
)
public class ItemsResource {

    (...)

    @GET
    @Operation(description = "Returns the item list overview")
    @APIResponse(responseCode = "200", description = "Valid response")
    @APIResponse(responseCode = "401", description = "Authentication required")
    @APIResponse(responseCode = "500", description = "Unexpected exception")
    @Produces({MediaType.APPLICATION_JSON})
    @SecurityRequirement(name ="JWT", scopes = "write: read")
    @RolesAllowed({Constants.USER_ROLE_EXPERT})
    public Response getItemListOverview() throws TechnicalException {
        ItemListOverviewVO itemListOverviewVO = logic.getItemListOverview();
        return Response.status(Status.OK).entity(itemListOverviewVO).build();
    }

因此,我现在在OpenAPI JSON文件中有security信息,但是UI中仍然没有用于授权参数的字段。

public Response getItemListOverview(@HeaderParam("Authorization") String bearerToken) throws TechnicalException {

现在我的UI中有一个授权字段,但是当我测试endpoint时,请求没有授权头。我在浏览器的网络分析中看不到它。

到目前为止,OpenAPI文档没有什么帮助。我是不是漏掉了什么?

共有1个答案

阎兴为
2023-03-14

关键是在@components()中嵌入@securityscheme注释,并将其作为参数传递给@openapidefinition注释:

@OpenAPIDefinition(
        info = @Info(title = "My application", version = "1.0.0"),
        servers = {@Server(url = "/myapp", description = "localhost") },
        security = @SecurityRequirement(name = "JWT"),
        components = @Components(securitySchemes = @SecurityScheme(
                securitySchemeName = "JWT",
                description = "JWT authentication with bearer token",
                type = SecuritySchemeType.HTTP,
                scheme = "bearer",
                bearerFormat = "Bearer [token]"))
)
public class ApplicationConfig extends Application {

}
 类似资料:
  • 我有以下配置: 我找到了解决方法——用以下方法标记每个独立endpoint: 但我不喜欢做这种重复的工作。 是否有一种方法可以使每个其他端都实现全球化?

  • 我在做概念验证。我正在使用Azure Active Directory并试图在遗留项目中实现OAuth。 这个项目的一半使用Web表单,另一半直接通过JavaScript在另一个项目中调用WebAPI。 作为一个测试,我通过UseOpenIDConnectauthEntication的AuthorizationCodeReceed通知事件获得承载令牌。我使用以下代码将令牌快速写入调用WebAPI的

  • 我在用阿斯匹林。网络应用程序 我很困惑。我已经使用JSON网络令牌。我明白这一点。已知经典的 JSON 网络令牌。标头、有效负载、签名、自包含。客户端可以查看索赔数据。 但是不记名令牌是什么呢?不记名令牌也是独立的。我们可以通过不记名令牌访问令牌的数据。客户端看不到索赔数据。 那我们为什么不使用不记名令牌呢?不记名代币不是标准吗?有没有像 JWT 持有者令牌这样的东西? 以及如何在 MVC Web

  • 我有两个站点,一个用户登录并管理他们的帐户的站点和一个没有UI的站点,只不过是一个存储和检索内容的API。这两个站点都使用相同的Owin ASP. Net Idreal 2.0设置。UI站点使用cookie的原因很明显,API站点使用承载令牌。我需要能够使用当前用户身份验证从UI站点调用API方法/url。简而言之,我需要在UI站点中生成一个有效的承载令牌,以便在进行Rest API调用时添加到H

  • 问题内容: 为了生成用于访问我们的API的32个字符的令牌,我们目前使用: 我已经读到,这种方法不是基于密码的安全性,因为它基于系统时钟,这将是一个更好的解决方案,因为它很难预测。 如果是这种情况,等效代码将是什么样? 我猜是这样的,但是我不知道这是否对… 我应该传递给函数什么长度也有意义? 问题答案: 这是正确的解决方案: