对于某些API调用中的签名验证,我必须从请求正文中计算签名,并将其与标头中的一个进行比较。由于我无法找到任何预定义指令可以完成这项工作,我推出了一个这样的自定义指令:
def verifySignature(channelSecret: String): Directive0 =
headerValueByName("X-Line-Signature").flatMap { signature =>
entity(as[String]).flatMap { bodyString =>
if (computeSignature(channelSecret, bodyString) == signature) pass
else reject
}
}
这可以按预期工作。
所以我只是想知道它是否会更好。 是否有任何指令可以更好地完成这项工作? 使用传递?
是否正确答案 0 :(得分:2)
这对我来说很好看。 pass
是结束Directive0
的正确方法,它由更复杂的Akka HTTP指令(随机示例,method指令)使用。
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"))
}