Директива использует как заголовок, так и тело запроса в 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
  }
}

Это работает, как и ожидалось.

Так что мне просто интересно, может ли это быть лучше. Есть ли какая-нибудь директива, которая может улучшить эту работу? И правильно ли использовать pass?


person XoYo24    schedule 28.12.2016    source источник


Ответы (1)


Это выглядит хорошо для меня. pass — это правильный способ завершить Directive0, и он используется более сложными HTTP-директивами Akka (случайный пример, метод).

Насколько я знаю, нет конкретной директивы для выполнения нужной вам задачи. И это, будучи очень просто созданным как пользовательская директива, вероятно, не должно быть.

Пара крошечных улучшений, которые вы можете сделать:

  1. вы должны отклонить с правильным отказом - чтобы упростить их обработку с помощью правильного ответа + код состояния

  2. вы можете сгладить 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"))
    }
person Stefano Bonetti    schedule 28.12.2016