我試圖檢索訪問令牌,以便使用Oauth2驗證用戶。我主要使用google的HOW-TO頁面上發現的代碼來使用帶有golang的Calendar API。問題是,每當我試圖獲得一個道理,谷歌發回這樣的:Google Calendar API invalid_grant獲取令牌(Golang)
Response: {
"error" : "invalid_grant"
}
與錯誤oauth2: cannot fetch token: 400 Bad Request
正如我所說的,我使用一些代碼從谷歌的HOWTO了,只是略作修改以適應我的需求。在「getTokenFromWeb(代碼)」(如果我理解正確的發生
//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)
}
錯誤,代碼必須有一些隨機字符串,不管它的價值,它只是需要在整個過程中相同)。 這是有問題的代碼:
func getTokenFromWeb(code string) (*oauth2.Token, error) {
tok, err := config.Exchange(context.Background(), code)
return tok, err
}
執行後,我看到了什麼是錯誤。我甚至得到完全相同的錯誤當試圖複製粘貼谷歌自己的示例代碼!
任何想法?我真的無法在網上找到解決方案。
額外的細節:使用IRIS web框架;使用最新版本的google日曆api;使用最新版本的Golang;我在Google雲端控制檯上爲OAuth2創建了一個客戶端ID;該網站獲得了可信的SSL證書;它偵聽端口80(HTTP)和4433(HTTPS);
啊,所以它被髮送到客戶端..但我如何檢索它?我猜它是通過GET請求作爲URL參數發送到web服務器的,所以我只需要在用戶請求重定向後簡單地讀取它。我會盡快檢查,我沒有誠實地檢查參數。 –
謝謝,再次嘗試後,我發現代碼是作爲查詢參數發送的。現在我又遇到了另一個問題。 (現在編輯該問題) –
編輯前,代碼保持在url欄中並且每次點擊 html元素時都會刷新它是否正常?它看起來很奇怪,特別是因爲我沒有在用戶通過身份驗證後與谷歌交換任何代碼。不僅如此,URL路徑也不會改變(我點擊'Go here',但url保持爲'https://myside.com?state = state-token&code = c/odeThatChangesEveryTime') –