• 如何在Swagger2或Swagger3中增加Json Web Token


    1. 前言

    Swagger 3.0已经发布有一段时间了,作为一个非常有用的文档工具已经越来越多的项目在使用它。而JWT也是目前前后端分离最常用的安全技术。那么如何在Swagger 3.0 中添加JWT Token呢?今天胖哥就分享一下这个知识点。

    2. Swagger2 中添加 JWT

    我们先来回顾在Swagger2中是如何添加JWT的。在Swagger2中我们声明DocketBean 时利用全局参数注入一个Authorization请求头:

    private List<Parameter> jwtToken() {
     
            String jwt "Bearer {jwt}";
     
            ParameterBuilder tokenPar new ParameterBuilder();
            List<Parameter> pars = new ArrayList<>();
            // 声明 key
            tokenPar.name("Authorization")
                    // 文字说明
                    .description("jwt令牌")
                    // 类型为字符串
                    .modelRef(new ModelRef("string"))
                    // 参数形式为 header 参数
                    .parameterType("header")
                    // 默认值
                    .defaultValue(jwt)
                    // 是否必须
                    .required(false);
            pars.add(tokenPar.build());
            return pars;
        }
     
       @Bean
        public Docket api() {
     
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .globalOperationParameters(jwtToken())
                    .select()
                    .apis(RequestHandlerSelectors.any())
                    .paths(PathSelectors.any())
                    .build();
        }
     

    效果如下,你只需要填充一个可用的Jwt Token即可。

    swagger2中注入jwt请求头

    但是这种方式只能适用于 Swagger2,在 Swagger3 中并不凑效。

    3. Swagger3 中添加 JWT

    那么Swagger3中应该如何做呢?Swagger3同样也是在声明DocketBean 中注入,如下:

        @Bean
        public Docket api() {
     
            return new Docket(DocumentationType.OAS_30)
                    .apiInfo(apiInfo())
                    .securitySchemes(Collections.singletonList(HttpAuthenticationScheme.JWT_BEARER_BUILDER
    //                        显示用
                            .name("JWT")
                            .build()))
                    .securityContexts(Collections.singletonList(SecurityContext.builder()
                            .securityReferences(Collections.singletonList(SecurityReference.builder()
                                    .scopes(new AuthorizationScope[0])
                                    .reference("JWT")
                                    .build()))
                            // 声明作用域
                            .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                            .build()))
                    .select()
                    .apis(RequestHandlerSelectors.any())
                    .paths(PathSelectors.any())
                    .build();
        }

    通过Swagger3中Docket提供的securitySchemessecurityReferences方法进行JWT的配置。效果以及流程如下:

    Swagger3中jwt使用流程

    我们可以看到请求时会携带一个Bearer Token:

    Swagger3中携带jwt

    感觉Swagger3中设置JWT比Swagger2中要麻烦一些,不过能用就行。

    4. 总结

    今天对Swagger2和Swagger3中设置JWT Token进行了分享,作为两种经常在项目中使用的工具,我们不需要知道具体的原理,只知道如何来简化我们的使用和开发即可。

  • 相关阅读:
    算法两则
    windows XP 神key
    mysql空间型数据使用python executemany批量插入报错
    关于集合的相似度测量方法
    读取经纬度坐标并存储为字典格式,即key为ID,value为轨迹点
    ubuntu下安装软件时报错解决:Unmet dependencies. Try 'apt-get -f install' with no packages
    ubuntu环境下pycharm编译程序import包出错:ImportError: dynamic module does not define init function (init_caffe)
    linux Ubuntu14.04 make编译文件报错:No rule to make target `/usr/lib/libpython2.7.so', needed by `python/_pywraps2.so'. Stop.
    U盘安装Ubuntu14.04&配置远程win10远程连接
    解决:error LNK1169: 找到一个或多个多重定义的符号
  • 原文地址:https://www.cnblogs.com/edda/p/14419687.html
Copyright © 2020-2023  润新知