swagger帶token或者cookie怎麼過驗證
阿新 • • 發佈:2019-02-03
問題由來:
最近愈發感覺寫介面文件太麻煩了,就研究了一下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));
}
}
效果如下
“`