Как выполнить аутентификацию на основе токенов с помощью директивы 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.

Другие вопросы по тегам