Oauth2を使用してユーザーを認証するためにアクセストークンを取得しようとしています。私はgolangでカレンダーAPIを使用するためのGoogleのHOW-TOページにあるほとんどのコードを使用しています。私はちょうど少し変更し、GoogleのHOWTOから得たいくつかのコードを使用しています、言ったようにエラーoauth2: cannot fetch token: 400 Bad Request
GoogleカレンダーAPI invalid_grant get token(Golang)
で
Response: {
"error" : "invalid_grant"
}
:問題は、私はトークンを取得しようとするたびに、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(コード)」で発生)。 これは問題のあるコードです:実行後
func getTokenFromWeb(code string) (*oauth2.Token, error) {
tok, err := config.Exchange(context.Background(), code)
return tok, err
}
、私が見ると、そのエラーです。私は正確に同じエラーを得るコピー貼り付けGoogle自身のの例コード!
私は本当に解決策をオンラインで見つけることができません。
詳細:IRIS Webフレームワークを使用。 GoogleカレンダーのAPIの最新バージョンを使用して、 Golangの最新バージョンを使用します。 Google Cloud ConsoleでOAuth2のクライアントIDを作成しました。ウェブサイトには信頼できるSSL証明書があります。ポート80(HTTP)とポート4433(HTTPS)で待機します。ここで
ああ、それはクライアントに送信されます..しかし、どのように私はそれを取得できますか?私はそれがGETリクエストを通じてURLパラメータとしてWebサーバーに送信されたと思いますので、リダイレクトされた後にユーザー要求から単純に読み取る必要があります。私はできるだけ早くチェックします、私は正直にパラメータをチェックしませんでした。 –
ありがとう、もう一度試した後、コードがクエリパラメータとして送信されることがわかります。今私は別の問題があります。 (今質問を編集する) –
を編集する前に、コードがURLバーに残り、 html要素をクリックするたびにリフレッシュされるのは普通ですか?私はユーザーが認証された後、Googleとコードを交換しないので、奇妙に見えます。これだけでなく、URLパスも変更されません(私は 'Go here'をクリックしますが、URLは 'https://myside.com?state = state-token&code = c/odeThatChangesEveryTime'のままです) –