我一直在深入研究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之类的模块进行授权/身份验证吗?
处理此类事情的最佳做法是什么?
真的很感激任何帮助, 提前谢谢,
答案 0 :(得分:9)
好的,这是用于身份验证,然后登录是独立的,您可以使用自己的系统或类似openID等。 问题是如何存储用户的身份验证。
保护REST服务的主要思想是使用在服务器端签名的auth令牌和一些用户标识符。 它会这样:
您有两种生成和检查令牌的解决方案:
这将创建无限令牌,因此您的用户永远不会被注销,您可以非常轻松地为这些解决方案添加到期日期:
如果使用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);
对于更短/更长的时间段,您可以将格式更改为更多或更少,以便每次生成令牌以进行检查时,您都处于同一时段。
对于随机数/数据库解决方案,您只需存储随机令牌的创建日期,然后查看它是否在您喜欢的时间段内。
如果您使用来自第三方的OpenID(或类似)标识,则必须向加载openID提供商页面的用户显示WebView,您只需确保重定向验证后包含隐藏在某处(例如标题中)的生成令牌的页面,并使用您的应用程序代码将其解压缩。
这很容易实现,但是我看到了play2的插件来处理令牌身份验证: https://github.com/orefalo/play2-authenticitytoken(从未使用过personaly) 和一个无国籍的auth: https://github.com/blendlabs/play20-stateless-auth
对于登录位,你不必实现它,有很好的模块可供玩耍: