10

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

首先,似乎 Play2/scala 有很多 auth-modules :例如t2v 的 Play20-auth。但问题是,这些解决方案基于在客户端存储 cookie。那正确吗 ?从纯 Web的角度来看,这很有意义:请求是从浏览器发送的,服务器可以将 cookie 存储在客户端等。

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

我还能使用t2v 的 Play20-auth等模块进行授权/身份验证吗?

处理这种事情的最佳做法是什么?

任何帮助将不胜感激,在此先感谢,

4

1 回答 1

9

好的,这是为了认证,然后登录是分开的,你可以使用自己的系统或者openID之类的东西。问题是如何存储用户被认证的。

保护您的 REST 服务的主要思想是使用在服务器端使用用户标识符签名的身份验证令牌。它会这样:

  1. 用户输入一个 ID/密码
  2. 一个休息方法检查这个,如果它是有效的,将一个令牌发送回手机。您将其存储在您的应用程序中
  3. 每次调用您的 REST API 时,您都会发送用户 ID 和令牌,并检查服务器上的令牌。

您有两种生成和检查令牌的解决方案:

  1. 令牌基本上是用户 ID,与您自己的一些盐(无论您想要什么秘密消息)连接,然后在您的服务器上使用私钥签名。就我个人而言,我使用 HMAC-SHA256 完成了此操作(在我的 scala 代码中使用 javax.crypto)。如果有人尝试使用您的 REST API,他们将无法生成令牌,因为他们不知道您的私钥或秘密。每次您在 REST API (3) 上收到请求时,您只需重新计算哈希值并将其与作为令牌发送的哈希值进行比较。
  2. 另一个解决方案是在数据库中为每个用户存储一个随机数,而不是带有用户 ID 的 HMAC。这将是您的令牌。每次收到请求时,您都会在数据库中检查该用户的秘密令牌,并查看它是否与查询中的相同。

这将创建无限令牌,因此您的用户将永远不会被注销,您可以很容易地为这些解决方案添加到期日期:

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

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

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

对于登录位,您不必实现它,那里有很好的模块可供使用:

于 2012-08-27T18:58:06.417 回答