指令在akka-http中使用请求标头和正文

时间:2016-12-28 14:33:45

标签: scala akka akka-http

对于某些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
  }
}

这可以按预期工作。

所以我只是想知道它是否会更好。 是否有任何指令可以更好地完成这项工作? 使用传递

是否正确

1 个答案:

答案 0 :(得分:2)

这对我来说很好看。 pass是结束Directive0的正确方法,它由更复杂的Akka HTTP指令(随机示例,method指令)使用。

AFAIK没有特定的指令可用于执行您需要的任务。而这非常简单地构建为自定义指令,可能不应该。

您可以做出一些微小的改进:

  1. 你应该拒绝正确的拒绝 - 通过正确的回复+状态代码来更轻松地处理它们

  2. 您可以使用&

  3. 展平2个嵌套指令
      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"))
        }