我正在为我的网络和移动应用程序开发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算法并试图为其添加一些用户身份验证。