Swagger和JWT令牌认证

时间:2017-04-27 23:06:07

标签: rest authentication jwt swagger

我正在构建一些Swagger文档,一切都很好,除了我想让页面以交互方式工作,所以当选择编辑器或UI时,如果我点击授权按钮,我会调用我的身份验证URL然后在后续请求中使用的JWT令牌。

我计划向API客户端发布Api访问密钥和秘密访问密钥,并希望点击将处理这些并构建JWT令牌的身份验证页面。

令我感到震惊的是,如果我能够在Swagger中获得如何实现这一目标的正确定义,那么我将拥有一个现成的测试客户端,然后使用我的新代码。

是的,这是我第一次使用JWT,而我还没有构建代码。你能说" API-First"?

2 个答案:

答案 0 :(得分:4)

这就是我使用Swagger和JWT身份验证的方式:

  • 编写Express.js API端点以生成JWT。
  • 使用上述终点创建一个Swagger路径来检索JWT
  • 在swagger.yaml根级别:

    securityDefinitions:  
      JWT:  
        type: apiKey  
        in: header  
        name: access_token  
    
  • 在swagger.yaml路径中:

    security  
     -JWT: []
    

这将在浏览器的Swagger UI中显示“授权”按钮。

  • 在单击“授权”按钮时弹出的“身份验证窗口”中输入上面生成的JWT
  • 现在JWT将与请求标头一起传递

希望这可以帮助别人。

答案 1 :(得分:0)

Swagger可以保存令牌并将令牌自动应用于所有请求。

这是您需要添加到Swagger Docket配置中的内容:

@Bean
public Docket newsApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .securitySchemes(Lists.newArrayList(apiKey()))
            .securityContexts(Lists.newArrayList(securityContext()))
            .apiInfo(generateApiInfo());
}

@Bean
SecurityContext securityContext() {
    return SecurityContext.builder()
            .securityReferences(defaultAuth())
            .forPaths(PathSelectors.any())
            .build();
}

List<SecurityReference> defaultAuth() {
    AuthorizationScope authorizationScope
            = new AuthorizationScope("global", "accessEverything");
    AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
    authorizationScopes[0] = authorizationScope;
    return Lists.newArrayList(
            new SecurityReference("JWT", authorizationScopes));
}

private ApiKey apiKey() {
    return new ApiKey("JWT", "Authorization", "header");
}

当您加载Swagger UI时,您将能够看到Authorize按钮。

enter image description here

您可以保存令牌,请确保在令牌前面添加“承载者”。

enter image description here