如何在Play中获取原始请求正文?

时间:2019-12-14 05:02:02

标签: scala playframework

我的播放应用程序具有一个端点,用于接收来自Stripe的Web钩子。

为了验证Web钩子,需要将请求正文与签名和签名密钥进行比较。这要求我有权访问发送的原始请求正文。

但是,似乎Play更改了请求正文,但我无法访问原始内容。这将导致计算的签名发生更改,并且验证失败。更多信息:https://stackoverflow.com/a/43894244/49153

这是我的代码:

@Singleton
class WebhookController @Inject()(cc : ControllerComponents,
                                  env: Env)
                                 (implicit ec: ExecutionContext)
  extends AbstractController(cc) {

  private val log = Logger("WebhookController")


  def index(): Action[AnyContent] = Action.async { implicit req =>

      val signature =
          req.headers.headers.find(_._1 == "Stripe-Signature").map(_._2).getOrElse("").trim

      if (verifySignature(req.body.toString, signature, env.webhookSecretKey))
        Future.successful(ok("ok"))
      else
          Future.successful(ok("Couldn't verify signature"))
  }


}

这里我正尝试使用req.body.toString访问主体,但它看起来像是反序列化的json而不是原始主体。

使用req.body.asRaw返回无。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用Action.async(parse.raw)解决此问题,然后执行req.body.asBytes().map(_.utf8String).getOrElse("")获得正文的原始字符串。更多信息:https://www.playframework.com/documentation/2.7.x/ScalaBodyParsers