有些同学在做前后端分离项目时用Swagger UI会碰到没有CSRF Token的报错,本文给出了支持CSRF Token的思路,其实很简单。
另外,当前Swagger UI已经更新到了3.x版本,截止到目前为止官方还没确定地给出好的方案(有讨论在这里),不过看节奏应该在六月份内,所以我也不打算研究比较Hack的方法,但如果你正好做过,欢迎在评论中给大家分享。3.x是一个重构的版本,底层更统一不过还有待增强功能,静待官方继续努力。
Swagger UI 版本 2.x
思路真的很简单。按照Laravel官方文档所说,在前端发起请求的时候附带一个请求头(Header)就行了。如果Swagger UI的界面是PHP输出的则最好办,示例如下:
// 省略若干行...
<!-- 添加下面这行到Swagger UI的Blade模版中<head>标签中 -->
<meta name="csrf-token" content="{{ csrf_token() }}">
// 省略若干行...
<script>
// 省略若干行...
window.swaggerUi.load();
// 添加下面这段代码到"window.swaggerUi.load();"的后面
swaggerUi.api.clientAuthorizations.add(
"X-CSRF-TOKEN",
new SwaggerClient.ApiKeyAuthorization(
"X-CSRF-TOKEN",
$('meta[name="csrf-token"]').attr('content'),
"header"
)
);
// 省略若干行...
</script>
如果Swagger UI不是由PHP渲染输出就比较麻烦了,能改代码的话,可以让前端自动设置Token,不然看看关于Swagger授权相关开发方法也许能够曲线救国实现。