通过REST api管理用户身份验证的正确方法?

时间:2012-06-09 12:01:36

标签: api authentication rest

我做了很多研究,如果这是达到我需要的最好方法,我就无法解决。

我有一个通用的网络应用程序,我想创建一个通用的移动应用程序来配合它。为了让用户保存数据/访问用户特定数据/等,他们必须登录,并且必须通过我的Web应用程序的REST api对登录进行身份验证。

因此api具有移动应用程序的私钥和公钥。公钥告诉我请求来自哪里(移动应用程序),私钥用作“盐”来散列查询字符串,然后当请求进入时可以在Web服务器上重新进行处理并比较有效性

要登录,用户输入用户名和密码,然后按照上述方法将其作为查询字符串变量发送。在另一端检查查询的有效性,并针对数据库检查用户名+密码对。如果登录正确,则会为该用户和公钥生成随机“身份验证令牌”,并将其发送回移动应用程序,以便在设备上进行本地存储。

当下一个请求来自移动应用程序时,其中一个查询字符串变量是来自之前的“身份验证令牌”,检查数据库中“auth令牌”表的有效性(使用应用程序的公钥)。如果有效则执行请求。

我的问题是,我做对了吗?这是实现我需要的最佳方式吗?最后一步似乎非常不安全,因为如果请求被截获,公钥和身份验证令牌都将可见。显然,请求将根据查询字符串的散列和另一端的私钥进行检查,这将确保请求不会来自恶意的任何地方。

还有其他步骤,或者我错过了哪些有用的东西?例如,我读到应该还有一个时间戳变量,应该在请求中的5/10分钟时间帧内进行检查。任何超过5/10分钟的时间戳都应该被拒绝。这很重要吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

您所描述的基本上是2-legged OAuth的自制版本。你可以基本上使用很多实现。每当谈到安全相关的东西时,我都会说:如果其他人已经这样做了,不要重新发明轮子。 OAuath被许多大型网站(Twitter,Facebook,GitHub,Google等)使用,他们已经做了大量研究纳入OAuth标准。所以我建议使用它们。

如果您担心发送的邮件可能被拦截,您应该使用HTTPS ...如果您通过网络传递用户名和密码组合,这通常是一个好主意。