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

时间:2013-11-27 11:02:35

标签: php api rest authentication hmac

我正在为我的网络和移动应用程序开发RESTful API。我对此API的意图是存储用户的所有数据,以便我的应用程序可以轻松访问它们。这就像Google的解决方案:您没有Gmail和Youtube的单独帐户,而是共享帐户。

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

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

  • 应用程序计算请求的签名:
    SIGNATURE = HMAC(HMAC(MESSAGE,user_password),application_key)

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

  • API重新创建签名以验证用户和应用程序:
    SIGNATURE = application_id / user_id HMAC(HMAC(MESSAGE,user_password_from_database),application_key)

例如:

  • application_id = 1

  • user_id = 123456

  • user_password ='mypass'

  • user_password_from_database ='$ 2y $ 10 $ 1234567890abcde ...'

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

我的问题是它是如何完成的?通过HTTPS将user_password_from_database发送到应用程序是一种很好的做法吗?我的基本工作流程是:

  • 用户使用user_email和user_password

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

  • 如果凭据正常,API会使用user_id和user_password_from_database进行响应

  • 从现在开始,应用程序可以使用这些数据来确定SIGNATURE。

  • 从现在起,API可以重新创建SIGNATURE,因为user_password_from_database是密钥,而不是user_password

这种算法有多安全? HTTPS是否会阻止滥用user_password_from_database?

脚注:上面详述的签名方法只是一个例子,我确实采用了亚马逊的AWS Signature Version 4算法并试图为其添加一些用户身份验证。

0 个答案:

没有答案