2016-10-31 3 views
1

Я использую oauth2 для доступа к стороннему API. Я могу получить токен доступа в порядке, но когда я пытаюсь вызвать API, передав токер-носитель в заголовках запроса, он дает мне ошибку 401 (неавторизованный). Хотя он работает хорошо, когда я пытаюсь сделать это через POSTMAN, передавая заголовки как (Authorization: Bearer). Но он не работает, используя go.Невозможно передать токен-носитель в заголовках запроса GET в Голанге

Вот пример кода.

url := "http://api.kounta.com/v1/companies/me.json" 

var bearer = "Bearer " + <ACCESS TOKEN HERE> 
req, err := http.NewRequest("GET", url, nil) 
req.Header.Add("authorization", bearer) 

client := urlfetch.Client(context) 

resp, err := client.Do(req) 
if err != nil { 
panic(err) 
} 
defer resp.Body.Close() 

body, _ := ioutil.ReadAll(resp.Body) 
writer.Write([]byte(body)) // Gives 401 Unauthorized error, though same works using POSTMAN 
+0

Вы пытались использовать 'Set()' заголовок вместо 'Add()' ing? ['Добавить()'] (https://golang.org/pkg/net/http/#Header.Add) добавляет значения в существующий заголовок, тогда как ['Set()'] (https://golang.org /pkg/net/http/#Header.Set) перезапишет существующие заголовки. Также в соответствии с заголовками RFC поля нечувствительны к регистру, но некоторые языки (например, PHP) не знают об этом и будут искать «Авторизация» ... – Havelock

+0

@Havelock: пакет goprotto goon canonicalizes всех заголовков, когда вы устанавливаете их. – JimB

+0

@TahirRauf: вы посмотрели на заголовки, чтобы посмотреть, как их отправляют? – JimB

ответ

3

Я был в состоянии решить эту проблему. На самом деле проблема была двоякой.

1) Конечная точка API выполняла перенаправление (302), что вызывало ответ 302, а затем вызывал другой API.

2) GO по умолчанию не пересылает заголовки, поэтому мой токен-носитель теряется посередине.

FIX:

мне пришлось переопределить функцию CheckRedirect клиента и вручную передать заголовки нового запроса.

client.CheckRedirect = checkRedirectFunc 

Вот как я переправил заголовки вручную.

func checkRedirectFunc(req *http.Request, via []*http.Request) error { 
    req.Header.Add("Authorization", via[0].Header.Get("Authorization")) 
    return nil 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^