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

kaf*_*ein 10 authentication android scala playframework-2.0

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

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

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

我还可以使用像t2v的Play20-auth这样模块进行授权/认证吗?

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

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

Mor*_*mer 9

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

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

  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);  
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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