2014-03-26 246 views
1

我很抱歉在网站上放置了另一个REST身份验证问题,但我真的需要得到一个完整的答案。我有一个REST API,我尝试登录单个页面网站(通过jQuery)。PHP REST API - 身份验证

我想创建一个基于令牌的身份验证,但有一些步骤我仍然无法理解。

首先,我必须做一个正常的身份验证来获取和存储数据库的用户登录名/密码? 我是否必须使用用户会话来存储令牌? 有人有我可以使用的PHP代码的例子吗?

源:

----------- --------------- EDIT

好吧,我有一些消息要补充。

  • 首先,是的,我有通过发送一对登录,SHA1(登录+ passwd文件)
  • 后,没有,从来没有使用像一个安全的方式会话存储数据,登录,使正常的认证和sha1(login + passwd)将存储在数据库或应用程序范围存储解决方案中,如haspmap。
  • 但我仍然需要你,如果你有一块PHP代码。这就是为什么我把我的答案作为编辑的原因。

回答

3

哦,我只是看到徽章“没有看法,没有很长时间的答案”,它把我带回了这里。 我终于找到了答案:

寄存器是你只做一次,所以你可以发送散列键没有一个很好的保护。 (我的意思是反对嗅探)。

因此,这里是注册的场景:

  • 客户端输入登录名和密码
  • 客户端发送的登录,散列(SHA256(登录+密码))
  • 服务器存储这对数据库(您可以缓存它HashMap来提高速度)

现在的登录

  • 客户端:通过html页面中的休息服务或隐藏字段请求会话salt。
  • 服务器:生成从日期时间和随机和存储该盐在会话
  • 客户端输入登录名和密码
  • 客户机JavaScript散列SHA256(SHA256(登录+密码)+盐),并存储在一对(登录,散列)在localStorage的(HTML5,要小心,以近代化或其他这样的东西,这对需要的,如果(SHA256(stored_hash_for_login + salt_in_session到留民营)
  • 服务器检查)收到==哈希)
  • 服务器:如果它确定存储与客户共享的令牌
  • 客户登录

现在每当客户想要做一个身份验证请求时,他会用下面的方法:

  • 获得对(登录,令牌)从localStorage的
  • 生成一个散列就像要求这个:
  • hash_request = sha256(login + sha256(token + timestamp)+ sha256(token + paramA)+ ...)
  • 参数需要按字母顺序排列。

服务器收到请求(登录,时间戳,则params,hash_request),检查时间戳是否不太旧的和做的产生从HashMap中的登录标识中的hash_request并检查它是否是相同的。 通过这种方式,您可以避免重播(时间戳)和清除密码。

+0

感谢您的回答。 – hardik

+0

这真棒!谢谢! –