Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带HMAC的RESTful API:如何管理用户身份验证_Php_Api_Rest_Authentication_Hmac - Fatal编程技术网

Php 带HMAC的RESTful API:如何管理用户身份验证

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

我正在为我的web和移动应用程序开发一个RESTful API。我使用此API的目的是存储用户的所有数据,以便我的应用程序可以轻松访问它们。这就像谷歌的解决方案:你没有一个单独的Gmail和Youtube账户,而是一个共享账户

对于每个请求(需要用户身份验证,而不仅仅是应用程序身份验证),将应用以下工作流:

  • 应用程序确定请求的消息:
    MESSAGE=URL+HEADERS+BODY

  • 应用程序计算请求的签名:
    签名=HMAC(HMAC(消息、用户密码、应用程序密钥)

  • 应用程序通过HTTP/HTTPS发送请求:
    请求=消息+签名

  • API重新创建签名以对用户和应用程序进行身份验证:
    签名=应用程序\ id/用户\ id HMAC(HMAC(消息、用户\密码\来自\数据库)、应用程序\密钥)

其中,例如:

  • 应用程序\u id=1

  • 用户id=123456

  • 用户密码='mypass'

  • 来自数据库的用户密码=“$2y$10$1234567890abcde…”

这种方法的问题是数据库中的密码是不可逆转地散列的(使用BCrypt),这就是为什么当我想重新创建请求的签名时不能使用它们

我的问题是如何实现这一目标?通过HTTPS将用户\u密码\u从\u数据库发送到应用程序是一种良好的做法吗?我的基本工作流程是:

  • 用户使用用户\电子邮件和用户\密码登录到应用程序

  • 应用程序通过HTTPS将这些凭据发送到API

  • 如果凭据正常,API将使用来自\u数据库的用户\u id和用户\u密码\u进行响应

  • 从现在起,应用程序可以使用这些数据来确定签名

  • 从现在起,API可以重新创建签名,因为来自数据库的用户密码是密钥,而不是用户密码

这个算法有多安全?HTTPS是否防止滥用用户密码


脚注:上面详述的签名方法只是一个例子,事实上,我采用了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规范中迷失的人,我可以推荐一篇精彩的文章,让你了解它的基本知识!这是: