запрос на открытие канала данных не содержит токена - PullRequest
0 голосов
/ 18 октября 2018

aws ssm start-session возвращает URL и токен, чтобы открыть WebSocket Connection.https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartSession.html#API_StartSession_ResponseSyntax

Попытка клиента открыть соединение WebSocket: https://hashrocket.com/blog/posts/development-of-a-simple-command-line-websocket-client

Но я получаю следующую ошибку при попытке отправить ввод типа {"type": "echo", "payload": "whoami"}

websocket: закрыть 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)

Большая часть кода такая же, как во 2-й ссылке, упомянутой выше, за исключением попытки использования wss (не ws).

Я предполагаю, что что-то отсутствует в заголовке.Любая идея?Thx

Ожидаемое поведение: Должен иметь возможность отправлять запросы (как указано выше) и успешно получать ответы.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы можете использовать номеронабиратель по умолчанию с ssm.StartSessionOutout.StreamUrl, без каких-либо заголовков авторизации:

conn, _, err := websocket.DefaultDialer.Dial(*ssmStartSessionOutput.StreamUrl, 
 nil)
if err != nil {
    log.Fatal(err)
}
defer conn.Close()

Затем отправьте токен ssm.StartSessionOutput через соединение через веб-сокет.Это поможет вам избежать ошибки, о которой идет речь:

v := struct {
    TokenValue string `json:"TokenValue"`
}{
    TokenValue: ssmStartSessionOutput.TokenValue,
 }
err := conn.WriteJSON(v)
if err != nil {
    return err
}

Но , реализация веб-сокета SSM StartSession практически не документирована и изобилует таинственными ответами.Мне посчастливилось запустить session-manager-plugin в качестве подпроцесса, передав JSON-ified 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()
0 голосов
/ 18 октября 2018

От Годока за DialContext, который, как я понимаю, вы просто используете набор, но это применимо.Акцент мой

https://godoc.org/github.com/gorilla/websocket#Dialer.DialContext

Если сбой рукопожатия WebSocket, ErrBadHandshake возвращается вместе с ненулевым * http.Response, чтобы вызывающие абоненты могли обрабатывать перенаправления, аутентификация и т. Д.Тело ответа может не содержать полного ответа и не должно закрываться приложением.

Пожалуйста, не отбрасывайте ответ, чтобы его можно было проверить, чтобы определить, как решить проблему.

Как правило, если что-то не получается, и вы игнорируете какое-то возвращаемое значение, проверьте и посмотрите, что вы игнорируете, и вы часто найдете решение.

Дайте мне знатьесли это помогает или нет, и я могу обновить / удалить ответ.

...