验证WebSocket连接

时间:2017-11-06 19:57:37

标签: node.js api

这可能看起来像是一个相当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

是什么阻止其他用户只是分享此链接,让无关的用户可以访问它?

2 个答案:

答案 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

本质上

  1. 使用网站的常规身份验证从浏览器向后端发出“ websocket preauth”请求
  2. 后端在响应正文中返回CSRF令牌,并在响应标头中使用SameSite=Strict设置“ websocket auth” cookie
  3. 尝试与后端建立websocket连接,并在查询参数中添加CSRF令牌
  4. 后端检查
    • websocket身份验证cookie和CSRF令牌有效
    • Origin标头的值与批准的域匹配
  5. 后端发送响应并升级连接以使用websockets