【问题标题】:Invalid Origin Header无效的原始标头
【发布时间】:2018-06-23 14:20:28
【问题描述】:

我正在尝试建立 websocket 连接,但出现错误:

请求标头中的来源不正确。

我的代码是:

def create_signature():
    timestamp = int(datetime.datetime.now().timestamp()) 
    string = "{}{}".format(timestamp, key)
    return timestamp, hmac.new(secret.encode(), string.encode(), hashlib.sha256).hexdigest()
def auth_request():
    timestamp, signature = create_signature()
    return json.dumps({'e': 'auth',
        'auth': {'key': key, 'signature': signature, 'timestamp': timestamp}})

def main():
    ws = create_connection(websocketURL)
    authentication = auth_request()
    ws.send(authentication)
    result = ws.recv()
    print(result)
    ws.close()

我正在运行main 函数。 auth_request 返回一个有效的 json。我正在尝试获取有效的响应对象,但连接失败。我已经导入了相关库并且没有任何语法错误。所有变量都在另一个文件中定义。

如何解决这个问题,这是我第一次使用网络套接字?

【问题讨论】:

  • 代码本身可能没问题 - 问题在于请求源标头和类似 CSRF/CORS 的行为 - 即服务器拒绝来自不同/不受信任域的请求。请参阅 tools.ietf.org/id/draft-abarth-origin-03.htmldeveloper.mozilla.org/en-US/docs/Web/HTTP/CORS 了解有关此类检查的 http 实现的一些背景知识。
  • 为什么是 HTTP CORS 问题,Web 套接字的全部意义不在于使用 TCP 而不是 HTTP?
  • @WMios:不;这将破坏整个网络的安全模型。 Web Sockets 是一种类似 HTTP 的协议,具有类似的限制。
  • @WMios:我相信它可能不会被实现为 CORS,但服务可以查看来源并选择拒绝来自不同域的来源。将更新评论以澄清。
  • @SLaks,谢谢,我没有意识到这一点!你如何在 python 中实现 websocket 标头?

标签: python websocket


【解决方案1】:

我相信您的代码来自 www.cex.io。 (如果不是,对不起)

为了使用 cex.io ws api,您需要在连接到 websocket 时声明正确的 Origin 标头Origin: wss.cex.io(我亲自向 cex.io 支持团队提出了这个问题)

对于市场数据(ticker, ohlcv..),您无需进行身份验证 https://gist.github.com/icehongssii/1c8ec1755dfee88c2789714ee9a37738.js

【讨论】:

  • 不再从事该项目,但谢谢 - 它是为 cex 的。 6 个月前的文档非常糟糕。
  • @WMios 是的,我完全同意他们有如此糟糕的文档。他们的支持并没有那么有帮助。即使我指出他们的代码,他们也没有修复它。
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 2012-06-27
  • 2011-06-08
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多