I'm trying to integrate Yahoo into my application.
I want users to login using their Yahoo accounts but whenever I request for a token, I receive the following errors:
getRequestToken() Exception: oauth.signpost.exception.OAuthCommunicationException:
Communication with the service provider failed: Service provider responded in error: 400 (Bad Request)
Here is my code (Request_Token_Activity.java):
import oauth.signpost.OAuth;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.signature.HmacSha1MessageSigner;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
public class Request_Token_Activity extends Activity {
private OAuthConsumer consumer;
private OAuthProvider provider;
private SharedPreferences prefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
consumer = new CommonsHttpOAuthConsumer("my consumer key", "my consumer secret");
consumer.setMessageSigner(new HmacSha1MessageSigner());
provider = new CommonsHttpOAuthProvider(
"http://api.login.yahoo.com/oauth/v2/get_request_token",
"http://api.login.yahoo.com/oauth/v2/get_token",
"http://api.login.yahoo.com/oauth/v2/request_auth");
} catch (Exception e) {
Log.e("", "onCreate Exception: " + e.toString());
}
getRequestToken();
}
private void getRequestToken() {
try {
String url = provider.retrieveRequestToken(consumer, "yahooapi://callback");
Log.i("", "Yahoo URL: " + url);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND);
this.startActivity(intent);
} catch (Exception e) {
Log.i("", "getRequestToken() Exception: " + e.toString());
}
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
final Uri uri = intent.getData();
if (uri != null && uri.getScheme().equals("yahooapi")) {
getAccessToken(uri);
}
}
private void getAccessToken(Uri uri) {
final String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
provider.retrieveAccessToken(consumer, oauth_verifier);
final Editor edit = prefs.edit();
edit.putString("YAHOO_OAUTH_TOKEN", consumer.getToken());
edit.putString("YAHOO_OAUTH_TOKEN_SECRET", consumer.getTokenSecret());
edit.commit();
String token = prefs.getString("YAHOO_OAUTH_TOKEN", "");
String secret = prefs.getString("YAHOO_OAUTH_TOKEN_SECRET", "");
consumer.setTokenWithSecret(token, secret);
Log.i("", "Yahoo OAuth Token: " + token);
Log.i("", "Yahoo OAuth Token Secret: " + token);
} catch (Exception e) {
Log.i("", "getAccessToken Exception: " + e.toString());
}
}
}
And this is a snapshot of my AndroidManifest.xml:
<activity android:name="Request_Token_Activity" android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="yahooapi" android:host="callback" />
</intent-filter>
</activity>
I have set-up my Yahoo Project
as a Web Application
and put Read and Write access
to Social
and Contacts
. What am I doing wrong?
The HyperText Transfer Protocol (HTTP) 400 Bad Request response status code indicates that the server cannot or will not process the request due to something that is perceived to be a client error (for example, malformed request syntax, invalid request message framing, or deceptive request routing).
A 400 Bad Request, also known as a 400 error or HTTP error 400, is perceived by the server as a generic client error and it is returned when the server determines the error doesn't fall in any of the other status code categories.
Looks like yahoo's api call is an ssl call. I don't know if it's that simple but your code has the Oauth providers as:
"http://api.login.yahoo.com/oauth/v2/get_request_token",
"http://api.login.yahoo.com/oauth/v2/get_token",
"http://api.login.yahoo.com/oauth/v2/request_auth");
according to http://developer.yahoo.com/oauth/guide/oauth-requesttoken.html
The provider should be Http*s*//api.login.yahoo.com/oauth/v2/get_request_token
additionally here are the yahoo oauth error codes and the reasons you would receive a 400 error http://developer.yahoo.com/oauth/guide/oauth-errors.html I would log my my request and see what paramater is missing/wrong/malformed etc.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With