如何在 Play 中获取原始请求体?
How to get the raw request body in Play?
我的播放应用程序有一个端点用于从 Stripe 接收 webhook。
为了验证 webhook,需要将请求正文与签名和签名密钥进行比较。这要求我有权访问发送的原始请求正文。
但是,Play 似乎更改了请求正文,我无法访问原始内容。这会导致计算出的签名发生变化,并且验证失败。更多信息:
这是我的代码:
@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
returns一个none。
有什么想法吗?
通过使用 Action.async(parse.raw)
然后执行 req.body.asBytes().map(_.utf8String).getOrElse("")
来获取正文的原始字符串来解决此问题。更多信息:https://www.playframework.com/documentation/2.7.x/ScalaBodyParsers
我的播放应用程序有一个端点用于从 Stripe 接收 webhook。
为了验证 webhook,需要将请求正文与签名和签名密钥进行比较。这要求我有权访问发送的原始请求正文。
但是,Play 似乎更改了请求正文,我无法访问原始内容。这会导致计算出的签名发生变化,并且验证失败。更多信息:
这是我的代码:
@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
returns一个none。
有什么想法吗?
通过使用 Action.async(parse.raw)
然后执行 req.body.asBytes().map(_.utf8String).getOrElse("")
来获取正文的原始字符串来解决此问题。更多信息:https://www.playframework.com/documentation/2.7.x/ScalaBodyParsers