Php 带HMAC的RESTful API:如何管理用户身份验证
我正在为我的web和移动应用程序开发一个RESTful API。我使用此API的目的是存储用户的所有数据,以便我的应用程序可以轻松访问它们。这就像谷歌的解决方案:你没有一个单独的Gmail和Youtube账户,而是一个共享账户 对于每个请求(需要用户身份验证,而不仅仅是应用程序身份验证),将应用以下工作流:Php 带HMAC的RESTful API:如何管理用户身份验证,php,api,rest,authentication,hmac,Php,Api,Rest,Authentication,Hmac,我正在为我的web和移动应用程序开发一个RESTful API。我使用此API的目的是存储用户的所有数据,以便我的应用程序可以轻松访问它们。这就像谷歌的解决方案:你没有一个单独的Gmail和Youtube账户,而是一个共享账户 对于每个请求(需要用户身份验证,而不仅仅是应用程序身份验证),将应用以下工作流: 应用程序确定请求的消息: MESSAGE=URL+HEADERS+BODY 应用程序计算请求的签名: 签名=HMAC(HMAC(消息、用户密码、应用程序密钥) 应用程序通过HTTP/HTT
- 应用程序确定请求的消息:
MESSAGE=URL+HEADERS+BODY - 应用程序计算请求的签名:
签名=HMAC(HMAC(消息、用户密码、应用程序密钥) - 应用程序通过HTTP/HTTPS发送请求:
请求=消息+签名 - API重新创建签名以对用户和应用程序进行身份验证:
签名=应用程序\ id/用户\ id HMAC(HMAC(消息、用户\密码\来自\数据库)、应用程序\密钥)
- 应用程序\u id=1
- 用户id=123456
- 用户密码='mypass'
- 来自数据库的用户密码=“$2y$10$1234567890abcde…”
- 用户使用用户\电子邮件和用户\密码登录到应用程序
- 应用程序通过HTTPS将这些凭据发送到API
- 如果凭据正常,API将使用来自\u数据库的用户\u id和用户\u密码\u进行响应
- 从现在起,应用程序可以使用这些数据来确定签名
- 从现在起,API可以重新创建签名,因为来自数据库的用户密码是密钥,而不是用户密码
脚注:上面详述的签名方法只是一个例子,事实上,我采用了Amazon的算法,并尝试在其中添加一些用户身份验证。在我看来,您试图在这里重新创建OAuth。原则上,您所建议的正是OAuth所做的:用户提供凭据,服务器验证用户并提供应用程序的访问令牌。然后,应用程序使用该访问令牌,只要该令牌有效,就可以向服务器验证所有后续API调用。您恰好选择了access token==散列用户密码,这更容易做到,但也“更糟”,因为密码更改将强制令牌失效。当然,上述解决方案的机制比OAuth更糟,因为所有信息都是公开的(应用程序/用户id),没有防止重播攻击等的保护。您应该真正了解OAuth 1.0,或者如果HTTPS是强制性的,那么OAuth 2.0(HTTPS处理了很多事情,使您的生活更轻松)。感谢您的评论,我将更深入地了解OAuth!请注意:我的解决方案完全基于Amazon的AWS签名版本4(因此它也可以防止重播攻击)。我唯一想添加的是一些用户身份验证。为了防止重播,需要一些nonce进入HMAC。AWS sig将此作为
x-amz-date
标题包含在内,仅通过阅读上述描述并不明显。@Jon我知道这是很久以前的事了,但我现在可以更深入地了解OAUTH。你绝对是对的,我的解决方案不适合移动应用和浏览器应用。对于那些在OAUTH 2规范中迷失的人,我可以推荐一篇精彩的文章,让你了解它的基本知识!这是: