如何pipe理从本地移动应用程序发送的用户请求的身份validation/授权,即调用Play2!-Scala REST服务

我一直在深入挖掘Play2!Scala文档,了解如何为用户请求实现身份validation/授权,我必须说我有点失落。 我想了解更多关于如何通过Play2!Scala支持的REST服务authentication/授权来自移动设备的请求。

首先,Play2 / scala有很多auth模块,例如t2v的Play20-auth 。 但问题是,这些解决scheme是基于在客户端存储cookie。 是对的吗 ? 从纯粹的networkingangular度来看,这是有道理的:请求从浏览器发送,服务器可以在客户端存储cookie等。

现在,如果我有一个原生的移动应用程序(在IOS或Android上),我只是在调用由Play2!Scala应用程序支持的REST服务。 在这种情况下,我不使用浏览器,所以服务器不能在客户端应用程序上存储cookie。

我是否仍然可以使用像t2v的Play20-auth模块进行授权/validation?

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

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

Solutions Collecting From Web of "如何pipe理从本地移动应用程序发送的用户请求的身份validation/授权,即调用Play2!-Scala REST服务"

好吧,这是为了validation,然后login是分开的,你可以使用自己的系统或类似openID等。问题是如何存储用户的身份validation。

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

  1. 用户input一个ID /密码
  2. rest方法检查这个,如果它是有效的,发送一个令牌回到手机。 您将其存储在您的应用程序中
  3. 每次你打电话给你的restAPI你发送用户ID和令牌,你检查服务器上的令牌。

你有两个解决scheme来生成和检查令牌:

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

这将创build无限令牌,所以您的用户永远不会被注销,您可以很容易地为这些解决scheme添加到期date:

  1. 如果使用HMAC,则将您的令牌(在签名之前)放入当前date。 例如,如果你想要一个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); 

    对于更短/更长的时间段,您将格式更改为包含更多或更less的内容,以便每次生成令牌时检查它是否落在同一时段。

  2. 对于随机数字/数据库解决scheme,您只需存储随机令牌的创builddate,并查看是否处于您喜欢的时间段。

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

这是相当简单的实现自己,但我已经看到了Play2的插件来处理令牌身份validation: https : //github.com/orefalo/play2-authenticitytoken (从来没有使用personaly)和一个用于无状态身份validation: https:// github.com/blendlabs/play20-stateless-auth

对于login位,你不必实现这个,有很好的模块用于播放: