开发者

Incorrect signature while accessing Twitter api on android

Hi In my android app I can make calls to Twitter api immediately after I login. I am using same instance of OAuthConsumer. But when I create OAuthconsumer for subsequent call and use setTokenWithSecret I get Incorrect signature error.

I spent few hours trying to debug but no luck... any help is appreciated.

Following is code ...in onnewIntent if statement 1== 1 works but I get Incorrect signature error If I call verify method on Twitter adapter

private static String TAG = "OAuthForTwitter";

private CommonsHttpOAuthConsumer httpOauthConsumer;
private OAuthProvider httpOauthprovider;
public final static String consumerKey = "";
public final static String consumerSecret = "";
private final String CALLBACKURL = "myapp://mainactivity";


@Override
protected void onNewIntent(Intent intent) {

    super.onNewIntent(intent);
    Log.d(TAG, "onNewIntent");

    Uri uri = intent.getData();

    if (uri != null && uri.toString().startsWith(CALLBACKURL)) {

        String verifier = uri
                .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);

        Log.d(TAG, "onNewIntent  " + " verifier " + verifier);
        try {

            httpOauthprovider.retrieveAccessToken(httpOauthConsumer,
                    verifier);
            String userKey = httpOauthConsumer.getToken();
            String userSecret = httpOauthConsumer.getConsumerSecret();

            if (1 == 1)开发者_开发问答 {
                String surl = "http://api.twitter.com/1/account/verify_credentials.xml";

                HttpGet request = null;
                HttpClient httpClient = null;
                HttpResponse response = null;
                request = new HttpGet(surl);
                httpOauthConsumer.sign(request);
                System.out.println("Sending request to Twitter...");
                httpClient = new DefaultHttpClient();

                response = httpClient.execute(request);
                String sresponse = parseResponseToString(response);
                Log.d(TAG, sresponse);
            } else {

                TwitterAdapter adapter = new TwitterAdapter(null,
                        consumerKey, consumerSecret, userKey, userSecret);
                String s = adapter.VerifyUser();
                Log.d(TAG, s);
            }

        } catch (Exception e) {
            Log.d(TAG, "onNewIntent error " + e.getMessage());
        }

    }
}


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    doOauth();
}

private void doOauth() {
    try {
        httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey,
                consumerSecret);
        httpOauthprovider = new DefaultOAuthProvider(
                "http://twitter.com/oauth/request_token",
                "http://twitter.com/oauth/access_token",
                "http://twitter.com/oauth/authorize");

        String authUrl = httpOauthprovider.retrieveRequestToken(
                httpOauthConsumer, CALLBACKURL);

        this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                .parse(authUrl)));
        Log.d(TAG, "sent doOauth");
    } catch (Exception e) {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
    Log.d(TAG, " doOauth Complete");
}


public class TwitterAdapter {

    oauth.signpost.commonshttp.CommonsHttpOAuthConsumer httpOauthConsumer;

    public TwitterAdapter(String username, String consumerkey,String consumersecret, String accesstoken, String accesssecret) {

        httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerkey, consumersecret);

        httpOauthConsumer.setTokenWithSecret(accesstoken, consumersecret);
    }


    public String VerifyUser() throws ClientProtocolException, IOException,
            OAuthMessageSignerException, OAuthExpectationFailedException,
            OAuthCommunicationException {

        String surl = "http://api.twitter.com/1/account/verify_credentials.xml";

        HttpGet request = null;
        HttpClient httpClient = null;
        HttpResponse response = null;
        request = new HttpGet(surl);
        httpOauthConsumer.sign(request);
        System.out.println("Sending request to Twitter...");
        httpClient = new DefaultHttpClient();

        response = httpClient.execute(request);
        return parseResponseToString(response);

    }
}

}


Have you tried using Scribe ?

It has a working example using Twitter and it's android-ready.


just tried linkedinexample.java and cannot pass line 37 : Verifier verifier = new Verifier(in.nextLine());

the application just stops. Am i the only one??


I tried your code... it works if I use as it is but if I change it to suit my application it does not work. I don't get back response for verify_credentials call. I must have missed something about OAuth. But here is what I am doing

public class scribeauth extends Activity {
    private static String TAG = "OAuthForTwitter";
    public final static String consumerKey = "";
    public final static String consumerSecret = "";
    private final String CALLBACKURL = "myapp://mainactivity";
    private static final String AUTHORIZE_URL = "https://twitter.com/oauth/authorize?oauth_token=";
    private static final String PROTECTED_RESOURCE_URL = "http://api.twitter.com/1/account/verify_credentials.xml";
    OAuthService service = null;
    Token requestToken = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        doOauth();
    }

    private void doOauth() {
        try {

            service = new ServiceBuilder().provider(TwitterApi.class)
                    .apiKey(consumerKey)
                    .apiSecret(consumerSecret)
                    .callback(CALLBACKURL).build();

            requestToken = service.getRequestToken();

            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                    .parse(AUTHORIZE_URL + requestToken.getToken())));

        } catch (Exception e) {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
        Log.d(TAG, " doOauth Complete");
    }

    @Override
    protected void onNewIntent(Intent intent) {

        super.onNewIntent(intent);
        Log.d(TAG, "onNewIntent");

        Uri uri = intent.getData();

        if (uri != null && uri.toString().startsWith(CALLBACKURL)) {

            String sverifier = uri
                    .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);

            Verifier verifier = new Verifier(sverifier);

            Token accessToken = service.getAccessToken(requestToken, verifier);

            String secret = accessToken.getSecret();
            String token = accessToken.getToken();

            new TwitterAdapter().VerifyUser(consumerKey, consumerSecret, token, secret);

        }
    }   

    public class TwitterAdapter {
        public String VerifyUser(String consumerkey, String consumersecret,
                String accesstoken, String accesssecret) {

            service = new ServiceBuilder().provider(TwitterApi.class)
            .apiKey(consumerkey)
            .apiSecret(consumersecret)
            .callback(CALLBACKURL).build();
            OAuthRequest request = new OAuthRequest(Verb.GET,PROTECTED_RESOURCE_URL);

            Token accessToken = new Token(accesstoken, accesssecret);
            service.signRequest(accessToken, request);
            Response response = request.send();
            String sresponse = response.getBody();
            Log.d(TAG, sresponse);
            return sresponse;
        }
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜