为bearer auth添加一个swagger注释

Ôre*_*rel 5 java jwt dropwizard swagger swagger-ui

我正在开发一个dropwizard REST服务.我使用https://bitbucket.org/b_c/jose4j/wiki/Home在jwt中添加了身份验证

令牌必须进入Authorization标头

Authorization: Bearer [TOKEN]
Run Code Online (Sandbox Code Playgroud)

我想找到一个很好的方法来添加一些swagger注释,以便在swagger-ui上拥有授权标头.

我找到了一个解决方法,隐藏了身份验证参数并添加了一个虚拟参数 @HeaderParam

@POST
@Path("/test/")
public Foo postBar(
        @Auth @ApiParam(hidden = true) Principal user,
        @ApiParam("data") Foo bar,
        @HeaderParam(value="Authorization")String dummy)
Run Code Online (Sandbox Code Playgroud)

这将添加到参数中:

{
  "name" : "Authorization",
  "in" : "header",
  "required" : false,
  "type" : "string"
} 
Run Code Online (Sandbox Code Playgroud)

如果我把@HeadParamPrincipal user我得到的运行时间:

Caused by: org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.

[[FATAL] No injection source found for a parameter of type public java.util.Map com.foo.bar.AppResource.get(java.security.Principal) at index 0.; source='ResourceMethod{httpMethod=GET, consumedTypes=[], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.mykronoz.data.tracking.resources.AppResource, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@6374d682]}, definitionMethod=public java.util.Map com.foo.bar.AppResource.get(java.security.Principal), parameters=[Parameter [type=interface java.security.Principal, source=Authorization, defaultValue=null]], responseType=java.util.Map<java.lang.String, java.lang.Object>}, nameBindings=[]}']
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

小智 3

如果添加一个 swaggerdefinition

@SwaggerDefinition(
  securityDefinition = @SecurityDefinition(
    apiKeyAuthDefinitions = {
      @ApiKeyAuthDefinition(key = "user", name = "Authorization", in = ApiKeyLocation.HEADER)
    }
  )
)
Run Code Online (Sandbox Code Playgroud)

然后,您将可以访问 swagger ui 的“授权”功能。添加“Bearer XXX....”字符串作为 API 密钥应该会导致调用端点,并按照您想要的方式设置授权标头并将用户字段设置为其值。

警告:我还没有看到这个端到端的工作,因为我的令牌本身有问题,但看起来我正在传递正确的东西。

  • 如果您有多个资源文件,我必须在哪里给出这个 @SwaggerDefinition 注释 (5认同)