2017-08-03 17 views
0

Oauth2を使用してユーザーを認証するためにアクセストークンを取得しようとしています。私はgolangでカレンダーAPIを使用するためのGoogleのHOW-TOページにあるほとんどのコードを使用しています。私はちょうど少し変更し、GoogleのHOWTOから得たいくつかのコードを使用しています、言ったようにエラーoauth2: cannot fetch token: 400 Bad RequestGoogleカレンダー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)で待機します。ここで

答えて

1

は、Googleの例である:

// 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要素をクリックするたびにリフレッシュされるのは普通ですか?私はユーザーが認証された後、Googleとコードを交換しないので、奇妙に見えます。これだけでなく、URLパスも変更されません(私は 'Go here'をクリックしますが、URLは 'https://myside.com?state = state-token&code = c/odeThatChangesEveryTime'のままです) –

関連する問題