在Android上访问Twitter api时签名不正确

时间:2010-10-24 13:37:04

标签: android twitter oauth

您好 在我的Android应用程序中,我可以在登录后立即拨打Twitter api。我正在使用相同的OAuthConsumer实例。但是当我为后续调用创建OAuthconsumer并使用setTokenWithSecret时,我得到错误的签名错误。

我花了几个小时尝试调试,但没有运气......感谢任何帮助。

以下是代码...在onnewIntent中,如果语句1 == 1有效但我得到错误的签名错误如果我在Twitter适配器上调用验证方法

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);

    }
}

}

3 个答案:

答案 0 :(得分:0)

您是否尝试过使用Scribe

它有一个使用Twitter的working example,并且它已准备就绪。

答案 1 :(得分:0)

我尝试了你的代码......如果我按原样使用它,但是如果我改变它以适合我的应用程序它不起作用。我没有收到verify_credentials调用的响应。我一定错过了关于OAuth的一些事情。但这就是我正在做的事情

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;
        }
    }
}

答案 2 :(得分:0)

刚试过linkedinexample.java并且无法传递第37行:Verifier verifier = new Verifier(in.nextLine());

应用程序停止了。我是唯一一个吗?