如何使用authenticate指令执行基于令牌的身份验证?

Rod*_*mez 3 access-token spray

我正在进行基于令牌的身份验证,我不知道我应该如何authenticate在我的路由中使用指令:

access_token从标题中得到了.

post {
  headerValueByName("Access_Token") {
    access_token => {
      authenticate(??????){
        user => {
          ......
          ......
       }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我该如何进行身份验证?

4le*_*x1v 8

有几种方法可以做到这一点,你可以使用像flavian提出的一些库来做或者自己做.认证指令没有太大作用,我只是"执行"Spray提供的标准认证机制,你可以在这里阅读它们.如果这不是你想要的或者不理解如何做到这一点,这里有一个小例子.

让我们假设最简单的令牌认证案例,您的令牌保存在一些存储中,并验证您想要比较它们的用户.所以我们有这个功能:

def validate(token: AuthToken): Future[Authentication[User]] = {
  torage.findUserByToken(token) match { 
    case Some(user) => Right(user)
    case None => Left(AuthenticationFailedRejection(..))
  }
}
Run Code Online (Sandbox Code Playgroud)

哪里Authentication[User]Either[Rejection, T]

如果你看看authenticate指令,它是用磁铁模式实现的,并且需要AuthMagnet你有一切可以得到它,因为它有一个转换:

implicit def fromFutureAuth[T](auth: ? Future[Authentication[T]])(implicit executor: ExecutionContext): AuthMagnet[T] =
    new AuthMagnet(onSuccess(auth))
Run Code Online (Sandbox Code Playgroud)

所以现在你可以使用它:

post {
  headerValueByName("Access_Token") { access_token => {
    authenticate(validate(access_token)) { user => {
      ......
      ......
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果您正在寻找一种安全的存储用户帐户的方法,请检查stormpath,将它们与Spray api集成起来非常容易.