使用令牌的 websocket 授权
Posted
技术标签:
【中文标题】使用令牌的 websocket 授权【英文标题】:websocket authorization with tokens 【发布时间】:2014-06-12 19:22:30 【问题描述】:在我的本地机器上,我正在运行 apache 服务器(php、mysql)和简单的 websocket 服务器(c++)。 现在我正在尝试使用令牌进行某种用户授权。在网上搜索了一番后,我决定坚持这个:
当客户端代码决定打开 WebSocket 时,它会联系 HTTP 服务器以获取授权“票证”。 服务器生成此票证。它通常包含某种用户/帐户 ID、请求票证的客户端的 IP、 时间戳,以及您可能使用的任何其他类型的内部记录保存 需要。 服务器存储此票证(即在数据库或缓存中),并将其返回给客户端。 客户端打开 WebSocket 连接,并将此“票证”作为初始握手的一部分发送。 然后服务器可以比较这张票,检查源 IP,验证票没有被重复使用并且没有过期,然后做任何事情 其他类型的权限检查。如果一切顺利,WebSocket 连接现已验证。
上述解决方案是否意味着必须查询数据库 2 次?首先在第 2 步和第 3 步中,在用户成功登录并 php 生成票证并将其放入数据库后。第 5 步中的第二个,什么时候(这次 websocket 服务器)必须通过再次查询同一个数据库来检查这张票?
【问题讨论】:
是的。必须查询数据库两次。一次插入,一次验证。 【参考方案1】:正如您所描述的,不仅数据库使用了两次,而且必须。当您在 Web 上涉及不受信任的客户端时,这就是您建立信任的方式。您以安全的方式存储信息,然后以安全的方式验证信息。
对令牌进行加密很重要,否则它在网络上传播时可能会被操纵。
例如,如果你用私钥加密令牌,那么当它回来时,只有公钥可以解密它。因此,如果成功,您就知道令牌是您的并且没有被篡改。
【讨论】:
您的公钥和私钥功能颠倒了。公钥加密;私钥解密(记住公钥是公开的)。此外,令牌不必加密。它可以由明文 + 签名(密钥散列)组成。如果有人更改数据,签名将失效(为了检查数据,服务器将明文与原始密钥进行散列,并将散列与提交的签名进行比较)以上是关于使用令牌的 websocket 授权的主要内容,如果未能解决你的问题,请参考以下文章
向 Django-channels WebSocket 发送授权凭证(不将令牌设置为 cookie)
如何在websocket javascript客户端中传递授权承载访问令牌