首页 > 解决方案 > 如何在 Reactjs 中生成 CSRF 令牌并发送到 Play Framework?

问题描述

我试图从反应表单发送一个发布请求到播放框架。它抛出以下错误:

Caused by: java.lang.RuntimeException: No CSRF token was generated for this request! Is the CSRF filter installed?

在使用 Play 模板时,CSRF 令牌是从模板本身处理的。由于我正在尝试将 React 用于前端,因此我无法使用 Play 模板。谁能指导我在 React 中生成 CSRF 令牌并将其传递给 Play?

提前致谢

标签: reactjsscalapostplayframeworkcsrf

解决方案


看起来您可以设置一个操作来生成 CSRF 令牌(请参阅文档):

如果您没有使用 CSRF 过滤器,您还应该注入 CSRFAddToken 和 CSRFCheck 操作包装器以强制添加令牌或对特定操作进行 CSRF 检查。否则令牌将不可用。

import play.api.mvc._
import play.api.mvc.Results._
import play.filters.csrf._
import play.filters.csrf.CSRF.Token

class CSRFController(components: ControllerComponents, addToken: CSRFAddToken, checkToken: CSRFCheck) extends AbstractController(components) {
  def getToken = addToken(Action { implicit request =>
    val Token(name, value) = CSRF.getToken.get
    Ok(s"$name=$value")
  })
}

获取这个并将其传递给 React 表单:

<input type="hidden" name="csrfToken" value="1234567890abcdef"/>

(或直接将其添加到 POST 请求中。)


推荐阅读