Как выполнить аутентификацию на основе токенов с помощью директивы authenticate?
Я делаю аутентификацию на основе токенов, и я не знаю, как я должен использовать authenticate
директива в моем маршруте:
я собираюсь access_token
из шапки.
post {
headerValueByName("Access_Token") {
access_token => {
authenticate(??????){
user => {
......
......
}
}
}
}
}
Как я могу аутентифицироваться?
1 ответ
Есть несколько способов сделать это, вы можете сделать это с некоторыми библиотеками, такими как предложенный flavian, или сделать это самостоятельно. Директивы аутентификации мало что делают, я просто "выполняю" стандартные механизмы аутентификации, предоставляемые Spray, о них вы можете прочитать здесь. Если это не то, что вы хотите или не поняли, как это сделать, вот небольшой пример.
Давайте представим самый простой случай с аутентификацией токена: ваш токен сохраняется в некотором хранилище, и для аутентификации пользователя, которого вы хотите, просто сравните их. Итак, у нас есть эта функция:
def validate(token: AuthToken): Future[Authentication[User]] = {
torage.findUserByToken(token) match {
case Some(user) => Right(user)
case None => Left(AuthenticationFailedRejection(..))
}
}
куда Authentication[User]
является Either[Rejection, T]
Если вы посмотрите на authenticate
директива, она реализована с помощью шаблона Magnet и требует AuthMagnet
и у вас есть все, чтобы получить его, потому что он имеет преобразование:
implicit def fromFutureAuth[T](auth: ⇒ Future[Authentication[T]])(implicit executor: ExecutionContext): AuthMagnet[T] =
new AuthMagnet(onSuccess(auth))
Так что теперь вы можете использовать его:
post {
headerValueByName("Access_Token") { access_token => {
authenticate(validate(access_token)) { user => {
......
......
}
}
}
Кстати, если вы ищете хороший и безопасный способ хранения учетной записи пользователя, проверьте Stormpath, их довольно легко интегрировать с API- интерфейсом Spray.