Я пытаюсь получить токен доступа для аутентификации пользователей с помощью Oauth2. Я использую в основном код, найденный на странице HOW-TO Google для использования Calendar API с golang. Проблема в том, что всякий раз, когда я пытаюсь получить токен, Google возвращает это:
Response: {
"error" : "invalid_grant"
}
С ошибкой oauth2: cannot fetch token: 400 Bad Request
Как я уже сказал, я использую код, полученный из руководства Google, только слегка измененный в соответствии с моими потребностями.
//Somewhere...
authURL = config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
//Somewhere else...
func getClient(ctx context.Context, config *oauth2.Config, code string) *http.Client {
cacheFile := tokenCacheFile()
tok, err := tokenFromFile(cacheFile)
if err != nil {
log.Printf("Google auth code not cached. Obtaining from the web...")
tok, err = getTokenFromWeb(code) //This returns an error
if err == nil {
log.Printf("Got token!")
saveToken("calendar-go-quickstart.json", tok)
} else { //Prevent saving token when error
log.Printf("Couldn't get OAUTH2 token! %s", err)
}
}
return config.Client(ctx, tok)
}
Ошибка возникает в "getTokenFromWeb (code)" (если я правильно понял, code должна быть некоторой случайной строкой, независимо от ее значения, она просто должна быть такой же во время весь процесс). Это проблемный код:
func getTokenFromWeb(code string) (*oauth2.Token, error) {
tok, err := config.Exchange(context.Background(), code)
return tok, err
}
После выполнения я вижу эту ошибку. Я даже получаю ту же ошибку при попытке скопировать и вставить собственный код Google!
Есть идеи? Я действительно не могу найти решение в Интернете.
Дополнительные сведения: использование веб-фреймворка IRIS; используя последнюю версию API календаря Google; используя последнюю версию Golang; Я создал идентификатор клиента для OAuth2 в Google Cloud Console; У веб-сайта есть доверенный сертификат SSL; прослушивает порт 80 (HTTP) и 4433 (HTTPS);