带有 OAuth access_token 的 socket.io-client io.connect 查询字符串
Posted
技术标签:
【中文标题】带有 OAuth access_token 的 socket.io-client io.connect 查询字符串【英文标题】:socket.io-client io.connect query string with OAuth access_token 【发布时间】:2016-05-29 01:47:23 【问题描述】:过去几天我已经通过堆栈溢出和谷歌搜索了这个问题。
我正在尝试连接到第 3 方 API,因此无法访问或查看 websocket 服务器。
我能够连接到 OAuth 端点并返回一个有效的访问令牌,但是我无法通过 socket.io-clients io.connect 方法传递这个访问令牌,而访问令牌没有被 urlencoded .
我用来访问端点的代码(具有过期但有效的访问令牌)
serviceEndpoint = "/uapi/ws/" + sha1(appId + accessToken) + "/" + instanceId + "/";
socket = io.connect(host,
transports: ['websocket'],
path: serviceEndpoint,
query: "access_token=1|5-zURhzg6X-vEWUwqBM~b9D0vqHJ-bBR|211|1455710158|7-ykMSvs07-w13mfhpf.CBNJEmmH.GY5"
);
当从服务器返回错误 (401) 时,正在请求的 url 具有以下 access_token 字符串:
access_token=1%7C5-zURhzg6X-vEWUwqBM~b9D0vqHJ-bBR%7C211%7C1455710158%7C7-ykMSvs07-w13mfhpf.CBNJEmmH.GY5
如您所见,所有管道 (|) 字符都已被编码,这导致令牌被服务器丢弃。
有没有办法阻止查询字符串被 urlencoded? 如果没有,有没有办法使用 socket.io-client POST 这个参数?【问题讨论】:
我认为您的问题可能出在 serviceEndpoint 而不是查询中。我已经阅读了您正在使用的 API,并在许多项目中使用了 socket.io。我从来没有遇到过 url 编码的问题,并且怀疑您正在使用的第 3 方 API 知道这一点。此外,您已经密切反映了他们的示例,这使我相信您的代码是正确的,并且更有可能存在此处未显示的问题。 当您说此处未显示的内容存在问题时,您是在谈论我端的代码还是 API 提供者端的代码?你是正确的,它密切反映了他们的例子,为了取出我自己的代码可能引入的任何外部变体,我复制并粘贴了他们的示例代码,唯一的变化是 appId 的 sha1 和访问令牌以镜像他们的 API 文档 我怀疑问题与您端的代码有关,特别是 serviceEndpoint = "/uapi/ws/" + sha1(appId + accessToken) + "/" + instanceId + "/";我的直觉是说 sha1(appId + accessToken) 出了点问题,这会导致你的 401。我觉得如果你有一个错误的访问令牌,你会得到一个不同的错误。 @MichaelHobbs 这完全是可能的,但是再次阅读文档,这是设备 ID 的描述:deviceId String SHA1 (AppId + AccessToken), where AppId and AccessToken are also used for OAuth authentication.
和 instanceId String A random string that identifies the connection context. If you want to open multiple WebSockets for the same app, use different instanceId.
你的主机字符串是什么样的?
【参考方案1】:
因此,在进行大量研究并查看其他方法以及与 API 提供商讨论之后,我发现的一种解决方法是将标头设置为连接。
This Stack Overflow Answer 绝对有帮助。请注意,socket.io-client 的版本需要 >= 1.4 才能正常工作
【讨论】:
以上是关于带有 OAuth access_token 的 socket.io-client io.connect 查询字符串的主要内容,如果未能解决你的问题,请参考以下文章