2017-08-03 193 views
0

我試圖檢索訪問令牌,以便使用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);

回答

1

下面是谷歌的例子:

// getTokenFromWeb uses Config to request a Token. 
// It returns the retrieved Token. 
func getTokenFromWeb(config *oauth2.Config) *oauth2.Token { 
    authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) 
    fmt.Printf("Go to the following link in your browser then type the "+ 
"authorization code: \n%v\n", authURL) 

    var code string 
    if _, err := fmt.Scan(&code); err != nil { 
    log.Fatalf("Unable to read authorization code %v", err) 
    } 
    ... 
} 

code是逛顯示的鏈接後提供給用戶的授權碼。 fmt.Scan()將掃描來自用戶的輸入。

如果您打算以不同的用戶名義行事,那麼您將不得不做類似於此示例的操作。 如果您只是以自己的身份行事,那麼您應該可以在沒有代碼的情況下進行身份驗證。

無論哪種方式,code不能是一個隨機字符串。

+0

啊,所以它被髮送到客戶端..但我如何檢索它?我猜它是通過GET請求作爲URL參數發送到web服務器的,所以我只需要在用戶請求重定向後簡單地讀取它。我會盡快檢查,我沒有誠實地檢查參數。 –

+0

謝謝,再次嘗試後,我發現代碼是作爲查詢參數發送的。現在我又遇到了另一個問題。 (現在編輯該問題) –

+0

編輯前,代碼保持在url欄中並且每次點擊 html元素時都會刷新它是否正常?它看起來很奇怪,特別是因爲我沒有在用戶通過身份驗證後與谷歌交換任何代碼。不僅如此,URL路徑也不會改變(我點擊'Go here',但url保持爲'https://myside.com?state = state-token&code = c/odeThatChangesEveryTime') –