springdoc-openapi swagger-ui 中的 CSRF 支持

Posted

技术标签:

【中文标题】springdoc-openapi swagger-ui 中的 CSRF 支持【英文标题】:CSRF Support in springdoc-openapi swagger-ui 【发布时间】:2020-09-09 08:46:06 【问题描述】:

当使用与 springdoc-openapi 捆绑的请求时,是否有一种方法可以自动将 CSRF 标头包含到从 swagger ui 发出的请求中?

在 springfox (GitHub) 中似乎实现了类似的解决方案,但我没有找到有关是否可以使用 springdoc-openapi 完成的信息。

【问题讨论】:

可以参考以下链接github.com/springfox/springfox/issues/1450不知道能不能帮到你 您提供了 Springfox 问题的链接。问题是如何在 Springdoc 库中实现 CSRF 支持。 你能分享一个最小的可运行样本吗? 【参考方案1】:

如果您使用标准标头,则默认支持 CSRF 令牌。(例如使用 spring-security 标头)

如果需要 CSRF Token,swagger-ui 会在每个 HTTP REQUEST 期间自动发送新的 XSRF-TOKEN。

也就是说 - 如果您的 XSRF-TOKEN 不是基于标准的,您可以使用 requestInterceptor 手动捕获最新的 xsrf 令牌,并通过 spring 资源转换器以编程方式将其附加到请求:

https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md#requestinterceptor

此外,CSRF 正在成为 less relevant over time,因为浏览器添加了用户代理级别的支持,以控制跨域请求 cookie 包含。

从 springdoc-openapi v1.4.4 版本开始,添加了一个新属性以启用 CSRF 支持,同时使用标准头名称:

springdoc.swagger-ui.csrf.enabled=true

【讨论】:

谢谢,我会尝试使用requestInterceptor。但是,我无法获得标准标头的自动支持,这是我的最小示例:github.com/Stjerndal/springdoc-csrf。我是否遗漏了一些东西以使其正常工作? starman,你可以用springdoc-openapi的最新快照进行测试,它增加了开箱即用的CSRF支持:github.com/springdoc/springdoc-openapi/issues/776【参考方案2】:

SwaggerUI 默认不将 CSRF-TOKEN 包含在请求中

如果您使用的是 React,您可以重用以下代码来手动包含它:

import React from 'react';
import SwaggerUI from "swagger-ui-react"
import "swagger-ui-react/swagger-ui.css"
import Cookies from 'universal-cookie';

const cookies = new Cookies();

const DocsPage = () => (
  <SwaggerUI url="/v2/api-docs" requestInterceptor=(request) => 
    request.headers['X-XSRF-TOKEN'] = cookies.get("XSRF-TOKEN")
  />
);

export default DocsPage;

【讨论】:

以上是关于springdoc-openapi swagger-ui 中的 CSRF 支持的主要内容,如果未能解决你的问题,请参考以下文章

从 Springfox Swagger 2 迁移到 Springdoc Open API

如何编写自定义排序器以在 UI 中按名称对 springdoc swagger 标签进行排序?

springdoc-openapi 应用默认全局 SecurityScheme 可能吗?

使用泛型继承的springdoc-openapi规范生成

springdoc-openapi 如何在不更改 toString 的情况下使用 @JsonValue 枚举格式?

使用 springdoc-openapi 和 spring-boot-starter-data-mongodb 生成 OpenAPI 文档