1. 程式人生 > >swagger帶token或者cookie怎麼過驗證

swagger帶token或者cookie怎麼過驗證

問題由來:

最近愈發感覺寫介面文件太麻煩了,就研究了一下swagger,springboot用起來確實不要太方便,什麼多餘的操作都不需要有就可以把連結甩給前端了。
但是通常我們的系統都是帶有身份認證的,無非幾種方式,cookie,session,token,前兩種可以算為一類,這個倒是比較好解決,下個chrome外掛,可以很輕鬆的把一個頁面下的cookie複製到我們的swagger-ui介面下來,但是要注意修改域。
比如 EditThisCookie 外掛。

但是token怎麼辦呢?必須要在每一個請求的header都加上token。

解決方案:


//通過Swagger2的securitySchemes配置全域性引數:如下列程式碼所示,securitySchemes的ApiKey中增加一個名為“Authorization”,type為“header”的引數。
private List<ApiKey> securitySchemes() { return newArrayList( new ApiKey("Authorization", "Authorization", "header")); } //在Swagger2的securityContexts中通過正則表示式,設定需要使用引數的介面(或者說,是去除掉不需要使用引數的介面),如下列程式碼所示,通過PathSelectors.regex("^(?!auth).*$"),所有包含"auth"的介面不需要使用securitySchemes。即不需要使用上文中設定的名為“Authorization”,type為“header”的引數。
private List<SecurityContext> securityContexts() { return newArrayList( SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.regex("^(?!auth).*$")) .build() )
; } //設定完成後進入SwaggerUI,右上角出現“Authorization”按鈕,點選即可輸入我們配置的引數。 //對於不需要輸入引數的介面(上文所述的包含auth的介面),在未輸入Authorization引數就可以訪問。 //其他介面則將返回401錯誤。點選右上角“Authorization”按鈕,輸入配置的引數後即可訪問。引數輸入後全域性有效,無需每個介面單獨輸入。
//至此,完成Swagger2 非全域性、無需重複輸入的Head引數配置。
//Swagger2的相關完整程式碼如下(工程基於Springboot):

@Configuration
@EnableSwagger2
public class Swagger {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).
                useDefaultResponseMessages(false)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.regex("^(?!auth).*$"))
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                ;
    }

    private List<ApiKey> securitySchemes() {
        return newArrayList(
                new ApiKey("Authorization", "Authorization", "header"));
    }

    private List<SecurityContext> securityContexts() {
        return newArrayList(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
                        .build()
        );
    }

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

效果如下
這裡寫圖片描述“`