这可能看起来像是一个相当noobish的问题,但我最近刚进入Node.js并且我需要确保在我的Laravel应用程序中发生的同一种身份验证发生在Node.js中。
显然,我需要使用API,但我对如何以安全的方式进行操作感到困惑。我查看了这篇文章:
https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf
已经查看了他们的算法来构建API。但我不明白它是如何安全的。
根据帖子,您将公钥和私钥存储在数据库中。每个人都可以看到公钥,但私钥是私密的。但是,在将其发送到服务器时,您将散列版本以及私有的其他数据发送到服务器。
这听起来很好。但是,这不意味着公钥和哈希是公共的,因此私钥也会公开吗?
例如,假设我尝试建立以下连接
ws://example.com/pull?public=A89-3NJ2-KAN-NKSN1&hash=QmFzZTY0IHRoZSBoZWxsIG91dCBvZiBtZSBiYWJ5Li4uLi4u
是什么阻止其他用户只是分享此链接,让无关的用户可以访问它?
答案 0 :(得分:0)
您链接的文章介绍了如何验证单个请求,而不是整个会话。也就是说,用户发送公开api_key
以及描述API特定请求的一些request
数据(例如,{ "action":"latest_price", "symbol":"GOOG"}
用于股票市场API)。
要进行身份验证,用户还使用共享API访问密钥作为HMAC
密钥来计算HMAC(secret, api_key+request)
。如果他们不了解secret
,其他任何人都无法计算出来。只有用户和服务器应该知道secret
,因为它基本上是用户使用API的密码。
您描述的情况非常不同:您正在使用WebSocket,因此我假设您将以交互方式发送请求。如果要对整个套接字会话进行身份验证,则此方法没有意义,因为它旨在验证单个请求。您可以将此方法应用于内部 WebSocket连接中的各个请求。
对于使用身份验证cookie验证新连接(即"登录用户打开此连接的位置是什么?"),就像使用传统HTTP连接一样。
下面,我假设Web Socket 的目的是只发送一个请求(这真让我想知道为什么它是WebSocket),所以请求级别的身份验证是有道理的。
是什么阻止其他用户只是分享此链接,让无关的用户可以访问它?
无。您是否希望其他人提交特定请求,同时冒充您?然后,无论如何,给他们链接并告诉他们使用它。
链接中的凭据包括API请求的HMAC(以及您的身份),只有您可以生成,作为API密钥的唯一所有者。如果您将HMAC提供给其他人,他们可以提交并模拟您的特定请求。但是,他们无法创建更多请求,因为他们没有秘密来为不同的请求提供更多的HMAC值。
事实上,如果您不希望提交该请求,则您不应该首先使用您的秘密来创建身份验证HMAC!您为什么要对您未提交的请求进行身份验证?
答案 1 :(得分:0)
看看this
本质上
SameSite=Strict
设置“ websocket auth” cookie Origin
标头的值与批准的域匹配