получить токен от клиента запроса OAuth - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий код, который я хочу получить токен из запроса, я передаю API / ClientSecret / ClientID

r := fmt.Sprintf("https://tenenat.host.com/oauth/token?grant_type=client_credentials&response_type=token&client_id=%s&client_secret=%s", CI, CS)
req, err := http.NewRequest(http.MethodPost, r, nil)
req.Header.Set("accept", "application/json")
res, err := httpClient.Do(req)
if err != nil {
    fmt.Println(os.Stdout)
    var t OAuthAccessResponse
    if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
        fmt.Println(os.Stdout, "could not parse JSON response: %v", err)
    }
    defer res.Body.Close()
}

При запуске я получил ошибку:

http 400 неверный запрос.

Есть идеи, если я что-то упустил в запросе?

Я не могу правильно отформатировать код :)

1 Ответ

0 голосов
/ 07 ноября 2018

Если этого можно избежать, вы не должны помещать конфиденциальные данные, такие как секрет клиента, в строку URL. Это менее безопасно, чем использование тела сообщения: например, оно может быть зафиксировано в журналах и аналитике трафика сайта, которые в конечном итоге будут переданы третьим лицам.

Вместо этого выполните POST с телом JSON:

type TokenRequest struct {
    GrantType    string `json:"grant_type"`
    ResponseType string `json:"response_type"`
    ClientID     string `json:"client_id"`
    ClientSecret string `json:"client_secret"`
}
tokenReq := &TokenRequest{
    GrantType:    grantType,
    ResponseType: responseType,
    ClientID:     clientID,
    ClientSecret: clientSecret,
}
body, err := json.Marshal(tokenReq)
if err != nil {
    log.Errorf("Failed to marshal request body: %s", err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(body))
if err != nil {
    log.Errorf("Failed to create request: %s", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
res, err := httpClient.Do(req)

Обновление

OP теперь получает ответ с кодом состояния 401. 401 не авторизован. Вам, вероятно, нужно пройти аутентификацию в API. Например, если у вас есть токен на предъявителя, добавьте заголовок для него перед выполнением запроса:

req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", bearer))
...