2012-02-17 9 views
4

リダイレクトuriが「urn:ietf:wg:oauth:2.0:oob」のときにOAuth 2.0経由で認証できますが、コードをコピーしてから、1つのアクティビティに戻ってフィールドに貼り付けます。私はその経験をそれよりもエレガントにしたい。リダイレクトuriが "http:// localhost"である場合(アクセスコードが返されても)、私はAPIにアクセストークンを交換することができません。Oauth 2がアクセストークンのコードを交換するのに失敗した場合、「invalid_grant」を返します

  ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
        0); 
      nameValuePairs.add(new BasicNameValuePair("client_id", 
        OAuth2ClientCredentialsMark1.CLIENT_ID)); 
      nameValuePairs.add(new BasicNameValuePair("client_secret", 
        OAuth2ClientCredentialsMark1.CLIENT_SECRET)); 
      nameValuePairs.add(new BasicNameValuePair("code", accessCode)); 
      nameValuePairs.add(new BasicNameValuePair("grant_type", 
        "authorization_code")); 
      nameValuePairs.add(new BasicNameValuePair("redirect_uri", 
        OAuth2ClientCredentialsMark1.REDIRECT_URI)); 
        //"http://localhost" 

      String url = "https://accounts.google.com/o/oauth2/token"; 
      //url += URLEncodedUtils.format(nameValuePairs, "utf-8"); 

      Log.d("print", url); 
      HttpPost hPost = new HttpPost(
        url); 
      hPost.setHeader("content-type", "application/x-www-form-urlencoded"); 

      hPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

このコードでは常に{"error": "invalid_grant"}が返されます。

マイアプリはhttps://github.com/ddewaele/LatitudeOAuth2Sample @サンプルのベースとしており、私はあなたのコードが正しいと思われhttp://code.google.com/apis/accounts/docs/OAuth2InstalledApp.html

+0

私は同じ問題があります。 JavaではなくScalaを使用しますが、それ以外は同じです。私はリダイレクトURIとしてhttp:// localhost:9000を使用します。 – Magnus

+0

私は、インストールされたアプリケーションのOAuthで同じ問題に直面しています。あなたは問題を解決しましたか?コメントしてください。 – Khushboo

答えて

3

@チュートリアルを追ってきました。このエラーはOAuth2 spec section-5.2からのものです。

提供の許可許可(認可コード、リソースの所有者の認証情報など)やリフレッシュトークンが無効で、有効期限が切れ、失効した、URIは、認証要求で使用される、または他のクライアントに発行されたリダイレクトと一致していません。

ほとんどの場合、お客様のアプリケーションは、ユーザーによってまだ承認されていません。


についてのご懸念に答えるために:ユーザーは、コードをコピーすることを余儀なくされ、その後、バックつの活性を行くと、フィールド

に貼り付け

をあなたはどのような種類を明確にすることができoauth2 flow (scenario)の、あなたは開発していますか?

0
{ 
    "access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74" 
} 

あなたが最初にアプリケーションのaccess_tokenを取得しようとすると、これが上に表示されます。 1時間後にアクセストークンが失効すると、refresh_tokenを使用して新しいaccess_tokenを取得することができます....これはあなたのリンクですhttps://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token

1

次のスレッドが示唆しているように、TIMINGエラーである可能性があります。あなたのサーバーがワールドタイムクロックと同期していることを確認すると、エラーinvalid_grantのエラーを防ぐことができます。

私は自分のサーバーのうちの1台でこの問題を抱えていましたが、実際にはそれは世界時計から40秒遅れた唯一のものでした(それは将来でした)。 ntpdateを使用して強制的に日付を変更し、ntpサービスをインストールしました。それはLinuxボックスです。

https://groups.google.com/forum/?fromgroups=#!topic/google-analytics-data-export-api/4uNaJtquxCs

関連する問題