0

認証コードをアクセストークンと交換しようとしましたが、成功しませんでした。ユーザープロファイルにアクセスする必要があります。これが私のコードです:

最初に認証コードを取得します。

編集:

private void googleAuthenticate(){
    try {
        mOAauthHelper = new OAuthHelper("something.net", "xxxxx", 
                "https://www.googleapis.com/auth/userinfo.profile", "alex://myScheme");
        String uri = mOAauthHelper.getRequestToken();

        startActivity(new Intent("android.intent.action.VIEW", Uri.parse(uri)));

       //Intent i = new Intent(this, GoogleOAUTHActivity.class);
       //i.putExtra(GoogleOAUTHActivity.GOOGLE_OAUTH_ENDPOINT_KEY, uri);            
       //startActivity(i);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        failedAuthenticatingAtGoogle();
    } catch (OAuthMessageSignerException e) {
        e.printStackTrace();
        failedAuthenticatingAtGoogle();
    } catch (OAuthNotAuthorizedException e) {
        e.printStackTrace();
        failedAuthenticatingAtGoogle();
    } catch (OAuthExpectationFailedException e) {
        e.printStackTrace();
        failedAuthenticatingAtGoogle();
    } catch (OAuthCommunicationException e) {
        e.printStackTrace();
        failedAuthenticatingAtGoogle();
    }
}

public OAuthHelper(String consumerKey, String consumerSecret, String scope,
        String callbackUrl) throws UnsupportedEncodingException {
    mConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
    mProvider = new CommonsHttpOAuthProvider(
            "https://www.google.com/accounts/OAuthGetRequestToken?scope="
                    + URLEncoder.encode(scope, "utf-8"),
            "https://www.google.com/accounts/OAuthGetAccessToken",
            "https://www.google.com/accounts/OAuthAuthorizeToken?hd=default");
    mProvider.setOAuth10a(true);
    mCallbackUrl = (callbackUrl == null ? OAuth.OUT_OF_BAND : callbackUrl);
}

    @Override
protected void onNewIntent(Intent intent) {

    System.out.println("onNewIntent");

    try {
        Uri uri = intent.getData();
        String oauthToken = uri.getQueryParameter("oauth_token");
       // String oauthToken = uri.getQueryParameter("oauth_verifier");
        System.out.println(oauthToken);

        if(oauthToken != null){
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/token");
            List<NameValuePair> pairs = new ArrayList<NameValuePair>();
            pairs.add(new BasicNameValuePair("code", oauthToken));
            pairs.add(new BasicNameValuePair("client_id", "something.net"));
            pairs.add(new BasicNameValuePair("client_secret", "xxxxxx"));
            pairs.add(new BasicNameValuePair("redirect_uri", "alex://myScheme"));
            pairs.add(new BasicNameValuePair("grant_type", "authorization_code")); //Leave this line how it is   
            post.setEntity(new UrlEncodedFormEntity(pairs));
            org.apache.http.HttpResponse response = client.execute(post);
            String responseBody = EntityUtils.toString(response.getEntity());
            System.out.println(responseBody); // That just logs it into logCat

            //authorizeGoogleSessionToServer(oauthToken);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

そして私は得る:{"エラー":"invalid_request"}

誰かがこの問題を解決する方法を知っていますか?

ありがとう。

4

1 に答える 1

1

パラメータを二重にエンコードしています。redirect_uri

次のようになります::

pairs.add(new BasicNameValuePair("redirect_uri", "your_own_redirect_URI"));

また、プロトコルの両方の実装(OAuth1とOAuth2)を混在させないように注意する必要があります。それらは同じように見えますが、等しくありません。

于 2012-06-27T08:57:36.440 に答える