2016-12-28 6 views
1

Для проверки подписи в некотором вызове API я должен вычислить Подпись от тела запроса и сравнить ее с заголовком. Так как я не мог найти какие-либо директивы Предопределенные могут сделать эту работу, я вышел с обычаем один, как это:Директива использует как заголовок запроса, так и тело в akka-http

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?

ответ

2

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

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

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

  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")) 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^