如何管理从调用Play2!-Scala REST服务的本机移动应用程序发送的用户请求的身份验证/授权

时间:2012-08-18 17:07:43

标签: android scala authentication playframework-2.0

我一直在深入研究Play2!Scala文档,该文档介绍了为用户请求实现身份验证/授权的可能方法,我必须说我有点迷失。 我想了解更多关于如何通过Play2!Scala支持的REST服务对移动设备发送的请求进行身份验证/授权。

首先,Play2 / scala似乎有很多auth-modules:例如t2v's Play20-auth。但问题是,这些解决方案基于在客户端存储cookie。是对的吗 ?这在纯Web透视中是有意义的:请求从浏览器发送,服务器可以在客户端上存储cookie等。

现在,如果我有一个本机移动应用程序(在IOS或Android上),我只是调用由Play2!Scala应用程序支持的REST服务。在这种情况下,我没有使用浏览器,因此服务器无法在客户端应用程序上存储cookie。

我还可以使用t2v's Play20-auth之类的模块进行授权/身份验证吗?

处理此类事情的最佳做法是什么?

真的很感激任何帮助, 提前谢谢,

1 个答案:

答案 0 :(得分:9)

好的,这是用于身份验证,然后登录是独立的,您可以使用自己的系统或类似openID等。 问题是如何存储用户的身份验证。

保护REST服务的主要思想是使用在服务器端签名的auth令牌和一些用户标识符。 它会这样:

  1. 用户输入了ID /密码
  2. 休息方法检查一下,如果它有效,则将令牌发送回电话。您将其存储在您的应用中
  3. 每次调用您的其余API时,您都会发送用户ID和令牌,然后检查服务器上的令牌。
  4. 您有两种生成和检查令牌的解决方案:

    1. 令牌基本上是用户ID,与您自己的某些盐连接(无论您想要什么秘密消息),然后使用服务器上的私钥进行签名。我个人使用HMAC-SHA256(在我的scala代码中使用javax.crypto)。 如果有人试图使用您的REST API,他们将无法生成令牌,因为他们不知道您的私钥或秘密。 每次在REST API(3)上收到请求时,只需重新计算哈希值并将其与作为令牌发送的哈希值进行比较。
    2. 另一种解决方案是在数据库中为每个用户存储一个随机数,而不是具有用户ID的HMAC。这将是你的代币。 每次收到请求时,都会在数据库中检查该用户的密钥令牌,并查看它是否与查询中的签名相同。
    3. 这将创建无限令牌,因此您的用户永远不会被注销,您可以非常轻松地为这些解决方案添加到期日期:

      1. 如果使用HMAC,则在您的令牌(签名前)输入当前日期。例如,如果你想要一个24小时的会话,你可以做类似的事情:

        val format = new SimpleDateFormat("d/M/yyyy");  
        isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));  
        val date = format.format(new Date());  
        val token = calculateHMAC(userID + date + secret);  
        

        对于更短/更长的时间段,您可以将格式更改为更多或更少,以便每次生成令牌以进行检查时,您都处于同一时段。

      2. 对于随机数/数据库解决方案,您只需存储随机令牌的创建日期,然后查看它是否在您喜欢的时间段内。

      3. 如果您使用来自第三方的OpenID(或类似)标识,则必须向加载openID提供商页面的用户显示WebView,您只需确保重定向验证后包含隐藏在某处(例如标题中)的生成令牌的页面,并使用您的应用程序代码将其解压缩。

        这很容易实现,但是我看到了play2的插件来处理令牌身份验证: https://github.com/orefalo/play2-authenticitytoken(从未使用过personaly) 和一个无国籍的auth: https://github.com/blendlabs/play20-stateless-auth

        对于登录位,你不必实现它,有很好的模块可供玩耍: