使用 Play 2 框架的基于令牌的身份验证

Posted

技术标签:

【中文标题】使用 Play 2 框架的基于令牌的身份验证【英文标题】:Token based authentication using Play 2 Framework 【发布时间】:2014-04-04 23:39:51 【问题描述】:

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

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

感谢您的帮助和建议

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

您好安德烈,感谢您的回复。我的问题更多的是在游戏中检查身份验证,而不是在 JS 方面。我今天会检查提供的文件。 @ArturSoler 我可以给你一些关于这个主题的例子,但你应该先检查一下存储库,也许你会在那里找到你需要的一切。 好的,我会尽快检查,今天晚些时候,如果我的所有疑虑都解决了,我会通知您。再次感谢!【参考方案2】:

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

【讨论】:

以上是关于使用 Play 2 框架的基于令牌的身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Ember.js 和玩!框架身份验证最佳实践

在 APNs 的上下文中,p8 和 p12 是不是分别表示基于令牌和证书的身份验证?

Play 框架 2.4 的 HTTP 基本身份验证

django rest 框架身份验证

链接是不是应该包含 HateOAS 中的身份验证令牌?

基本身份验证是基于令牌的身份验证吗?