Go 打开数据通道的请求不包含令牌

Go 打开数据通道的请求不包含令牌,go,websocket,aws-ssm,Go,Websocket,Aws Ssm,aws ssm启动会话返回url和令牌以打开WebSocket连接 已尝试客户端打开WebSocket连接: 但当我尝试发送类似{“type”的输入时,会出现以下错误:“echo”,“payload”:“whoami”} websocket:close 1003(不支持的数据):通道:打开数据通道的请求不包含令牌 我试着用多个选项设置标题,比如 headers := make(http.Header) headers.Add("Authorization", "Bearer " + token

aws ssm启动会话返回url和令牌以打开WebSocket连接

已尝试客户端打开WebSocket连接:

但当我尝试发送类似{“type”的输入时,会出现以下错误:“echo”,“payload”:“whoami”}

websocket:close 1003(不支持的数据):通道:打开数据通道的请求不包含令牌

我试着用多个选项设置标题,比如

headers := make(http.Header)
headers.Add("Authorization", "Bearer " + token)
headers.Add("token_type", "bearer")
headers.Add("access_token", token)
headers.Add("token", token)
headers.Add("Authentication", token)

//  "github.com/gorilla/websocket"
ws, _, err := websocket.DefaultDialer.Dial(url, headers)
除了尝试wss(而不是ws)之外,大多数代码与上面提到的第二个链接中的代码相同

我想我的头球缺了什么。有什么想法吗?Thx


预期行为:应该能够发送请求(如上所述)并成功获得响应。

来自godoc for
DialContext
,我知道您只是在使用dial,但它适用。重点矿山

如果WebSocket握手失败,则返回ErrBadHandshake 使用非nil*http.Response,以便调用方可以处理重定向, 认证,等等。响应主体可能不包含整个响应 响应,不需要由应用程序关闭

请尝试不要放弃响应,以便您可以检查它以确定如何解决问题

一般来说,如果某个问题没有解决,而您忽略了某些返回值,请检查并查看您忽略的内容,您通常会找到解决方案


让我知道这是否有帮助,我可以更新/删除答案。

您可以将默认拨号程序与
ssm.StartSessionOutout.StreamUrl一起使用,而无需任何验证头:

conn, _, err := websocket.DefaultDialer.Dial(*ssmStartSessionOutput.StreamUrl, 
 nil)
if err != nil {
    log.Fatal(err)
}
defer conn.Close()
然后,通过websocket连接发送
ssm.StartSessionOutput
令牌。这将使您克服有问题的错误:

v := struct {
    TokenValue string `json:"TokenValue"`
}{
    TokenValue: ssmStartSessionOutput.TokenValue,
 }
err := conn.WriteJSON(v)
if err != nil {
    return err
}
但是,SSM StartSession的websocket实现实际上没有文档记录,并且充满了神秘的响应。我很幸运地以子流程的形式启动了,并传递了JSON化的ssm.StartSessionOutput:

v := struct {
    SessionID  string `json:"SessionId"`
    StreamURL  string `json:"StreamUrl"`
    TokenValue string `json:"TokenValue"`
}{
    SessionID:  ssmSessionOutput.SessionId,
    StreamURL:  ssmSessionOutput.StreamUrl,
    TokenValue: ssmSessionOutput.TokenValue,
}
j, err := json.Marshal(v)
if err != nil {
    return nil, err
}

cmd := exec.Command("session-manager-plugin", string(j), region, "StartSession")
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
err = cmd.Run()

寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。您需要显示更多的代码。特别是拨号和任何其他相关代码。您是否能够使用稳定的预构建工具使用规定的方法连接到websocket?如果我理解正确,您的意思是将Sec websocket Accept设置为token。{101交换协议101 HTTP/1.1 1 1映射[Server:[Server]日期:[Thu,2018年10月18日21:41:42 GMT]连接:[升级]Upgrade:[websocket]Sec websocket Accept:[mytokenhere]]{0xc4201dca80}0[]false false map[]0xc4203e2700}@陌生人似乎要求升级连接,但我对websocket的了解基本为零。我将研究关于gorilla WebSocket的代码101,特别是您可能希望研究以下结构及其方法。另外,我的一个谷歌查询让我找到了一个人,他最终联系了AWS,发现这是AWS方面的一个配置问题,因此值得研究。@非常感谢你的时间/建议/帮助。谢谢!!!我想我会改变我的方法。幸运的是,我确实有办法解决我的问题。