7

我正在使用 Scala 中的 Play Framework 2 构建应用程序。它将是纯 RESTful 的,目前从 Javascript 单页应用程序进行调用。

集成基于令牌的身份验证的最佳方式是什么?Play2 有多个身份验证库,以及原始Secured特征,但尚不清楚哪个最方便。

感谢您的帮助和建议

4

2 回答 2

6

如果您在说“基于令牌”时指的是 JWT,您可能想看一下在Play2中实现 HTTP 基本身份验证的示例,以及这个答案:如何在 Scala 后端实现 JWT。好的部分是您既不需要 cookie,也不需要经过身份验证的用户的缓存。

为方便起见,包括来自第一个链接的内容:

def Secured[A](username: String, password: String)(action: Action[A]) = Action(action.parser) { request =>
  request.headers.get("Authorization").flatMap { authorization =>
    authorization.split(" ").drop(1).headOption.filter { encoded =>
      new String(org.apache.commons.codec.binary.Base64.decodeBase64(encoded.getBytes)).split(":").toList match {
        case u :: p :: Nil if u == username && password == p => true
        case _ => false
      }
    }.map(_ => action(request))
  }.getOrElse {
    Unauthorized.withHeaders("WWW-Authenticate" -> """Basic realm="Secured"""")
  }
}

使用如下:

def myAction = Secured("admin", "1234secret") {
  Action { request =>
    Ok
  }
}
于 2014-04-21T08:06:12.553 回答
5

我认为您应该在这里看看 James Ward 的方法。

简而言之,这种方法非常简单:

  1. 用户请求索引页面并加载您的单页应用程序
  2. 应用程序试图确定浏览器的 cookie 中是否存储了安全令牌(或者您可以使用 localStorage)
  3. 如果没有令牌 - 显示登录页面
  4. 如果存在令牌——我们认为我们已经通过了身份验证
  5. 应用程序尝试使用自定义标头中的令牌从服务器获取一些数据(如 X-AUTH-TOKEN)
  6. 如果一切正常,服务器验证令牌并用数据响应
  7. 如果令牌无效服务器以 401 响应,则从步骤 3 继续
  8. 对服务器的每个请求都使用相同的令牌

如果您想更深入地了解细节,请随时提出更多问题!

于 2014-04-10T08:16:53.700 回答