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

时间:2014-03-03 18:59:56

标签: scala rest authentication playframework http-token-authentication

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

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

感谢您的帮助和建议

2 个答案:

答案 0 :(得分:6)

如果您在说“基于令牌”时引用JWT,您可能需要查看在Play2中实现HTTP基本身份验证的this example,以及this answer:如何实现关于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
  }
}

答案 1 :(得分:4)

我认为你应该看看James Ward的方法here

这种方法很简单:

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