Scala 指令在akka http中同时使用请求头和请求体
对于某些API调用中的签名验证,我必须计算来自请求体的签名,并将其与标头中的签名进行比较。由于我找不到任何预定义的指令可以完成这项工作,因此我推出了如下自定义指令:Scala 指令在akka http中同时使用请求头和请求体,scala,akka,akka-http,Scala,Akka,Akka Http,对于某些API调用中的签名验证,我必须计算来自请求体的签名,并将其与标头中的签名进行比较。由于我找不到任何预定义的指令可以完成这项工作,因此我推出了如下自定义指令: def verifySignature(channelSecret: String): Directive0 = headerValueByName("X-Line-Signature").flatMap { signature => entity(as[String]).flatMap { bodyString =>
def verifySignature(channelSecret: String): Directive0 =
headerValueByName("X-Line-Signature").flatMap { signature =>
entity(as[String]).flatMap { bodyString =>
if (computeSignature(channelSecret, bodyString) == signature) pass
else reject
}
}
这正如预期的那样有效
所以我只是想知道它是否能更好。
是否有指令可以更好地完成这项工作?
使用传球是否正确?我觉得这很好
pass
是结束Directive0
的正确方法,更复杂的Akka HTTP指令(一个随机示例,该指令)使用它
AFAIK没有可用于执行所需任务的特定指令。这是一个非常简单的定制指令,可能不应该有
您可以做一些小小的改进:
&
def verifySignature(channelSecret: String): Directive0 =
(headerValueByName("X-Line-Signature") & entity(as[String])).tflatMap{
case (signature, body) if computeSignature(channelSecret, body) == signature => pass
case _ => reject(ValidationRejection("Invalid signature"))
}