2

在 oauth2 舞蹈的第 1 步之后,我可以在重定向 URL 中检索代码。这工作正常。但是之后,

我有一个 'com.google.api.client.http.HttpResponseException: 400 Bad Request' 错误

试图获取 accessTokenResponse。知道为什么吗?

AuthorizationCodeGrant request = new AuthorizationCodeGrant(new NetHttpTransport(),
                                new JacksonFactory(),
                                OAuth2ClientCredentials.ACCESS_TOKEN_URL,
                                OAuth2ClientCredentials.CLIENT_ID, 
                                OAuth2ClientCredentials.CLIENT_SECRET,
                                code,
                                OAuth2ClientCredentials.REDIRECT_URI);

                        try {
                            AccessTokenResponse accessTokenResponse = request.execute();
                            CredentialStore credentialStore = new SharedPreferencesCredentialStore(prefs);
                            credentialStore.write(accessTokenResponse );
                        } catch (IOException e) {
                            Log.e(TAG, "error= "+e);
                            e.printStackTrace();
                        }

这是触发错误的行:

AccessTokenResponse accessTokenResponse = request.execute();

我正在使用“com.google.api.client.auth.oauth2.draft10.AccessTokenRequest.AuthorizationCodeGrant”

我应该使用其他东西吗?有什么建议吗?

4

2 回答 2

1

请参阅授权流程的第 5 步或oauth/token 端点

好像你错过了grant_type。

于 2012-09-28T19:20:32.000 回答
1

这看起来有效:

// Create a new HttpClient and Post Header
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost(OAuth2ClientCredentials.ACCESS_TOKEN_URL);

                        try {
                            // Add your data
                            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);
                            nameValuePairs.add(new BasicNameValuePair("client_id", OAuth2ClientCredentials.CLIENT_ID));
                            nameValuePairs.add(new BasicNameValuePair("client_secret", OAuth2ClientCredentials.CLIENT_SECRET));
                            nameValuePairs.add(new BasicNameValuePair("code", code));
                            nameValuePairs.add(new BasicNameValuePair("grant_type", OAuth2ClientCredentials.TOKEN_GRANT_TYPE));
                            nameValuePairs.add(new BasicNameValuePair("redirect_uri", OAuth2ClientCredentials.REDIRECT_URI));
                            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                            Log.i(TAG, "httppost= "+inputStreamToString(httppost.getEntity().getContent()));

                            // Execute HTTP Post Request
                            HttpResponse response = httpclient.execute(httppost);
                            Log.i(TAG, "response= "+inputStreamToString(response.getEntity().getContent()));

                        } catch (ClientProtocolException e) {
                            Log.e(TAG, "error= "+e);
                        } catch (IOException e) {
                            Log.e(TAG, "error= "+e);
                        }

重定向 url 包含我需要的访问令牌。

于 2012-09-29T08:18:23.857 回答