使用Play 2 Framework进行基于令牌的身份验证

Art*_*ler 8 authentication rest scala playframework http-token-authentication

我在Scala中使用Play Framework 2建立一个应用程序.它将纯粹是RESTful,目前从Javascript单页面应用程序调用.

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

感谢您的帮助和建议

Cos*_*lis 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"""")
  }
}
Run Code Online (Sandbox Code Playgroud)

使用方法如下:

def myAction = Secured("admin", "1234secret") {
  Action { request =>
    Ok
  }
}
Run Code Online (Sandbox Code Playgroud)


And*_*rov 5

我认为您应该在这里看看詹姆斯·沃德的做法。

简而言之,该方法非常简单:

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

如果您想深入研究细节,请随时提出更多问题!