使用Oauth在android中调用yahoo api

使用Oauth在android中调用yahoo api,android,oauth,digital-signature,yahoo-api,Android,Oauth,Digital Signature,Yahoo Api,我想使用Yahoo API在Android中获取登录用户的电子邮件。我已经获得了访问令牌和用户GUID,但获取用户电子邮件的下一步不起作用 我收到了以下回复信息: {oauth=WWW-Authenticate: OAuth oauth_problem="OST_OAUTH_SIGNATURE_INVALID_ERROR", realm="yahooapis.com"} 我的代码可以找到,问题记录在第179行 请帮我解决这个问题。我得到了答案 完整代码: public class YahooS

我想使用Yahoo API在Android中获取登录用户的电子邮件。我已经获得了访问令牌和用户GUID,但获取用户电子邮件的下一步不起作用

我收到了以下回复信息:

{oauth=WWW-Authenticate: OAuth oauth_problem="OST_OAUTH_SIGNATURE_INVALID_ERROR", realm="yahooapis.com"}
我的代码可以找到,问题记录在第179行

请帮我解决这个问题。

我得到了答案

完整代码:

public class YahooScreen extends Activity {
    private static final String REQUEST_TOKEN_ENDPOINT_URL ="https://api.login.yahoo.com/oauth/v2/get_request_token";
    private static final String AUTHORIZE_WEBSITE_URL   ="https://api.login.yahoo.com/oauth/v2/request_auth";
    private static final String ACCESS_TOKEN_ENDPOINT_URL ="https://api.login.yahoo.com/oauth/v2/get_token";

    static final String YAHOO_CALLBACK_URL = "YOUR_YAHOO_CALLBACK_URL";
    static final String YAHOO_CONSUMER_KEY = "YOUR_YAHOO_CONSUMER_KEY";
    static final String YAHOO_CONSUMER_SECRET = "YOUR_YAHOO_CONSUMER_SECRET";

    private String oAuthVerifier;

    CommonsHttpOAuthConsumer mainConsumer;
    CommonsHttpOAuthProvider mainProvider;

    private Button button1;
    private OnClickListener button1_onclick = new OnClickListener()
    {
         public void onClick(View v)
         {
             new OAuthRequestTokenTask(v.getContext(),mainConsumer,mainProvider).execute();
         }
    };

    private Button button2;
    private OnClickListener button2_onclick = new OnClickListener()
    {
         public void onClick(View v)
         {
             new OAuthGetAccessTokenTask().execute();
         }
    };

    private Button button3;
    private OnClickListener button3_onclick = new OnClickListener()
    {
         public void onClick(View v)
         {
             getGUID();
         }
    };

    private Button button4;
    private OnClickListener button4_onclick = new OnClickListener()
    {
         public void onClick(View v)
         {
             showToken();
         }
    };

    private Button button5;
    private OnClickListener button5_onclick = new OnClickListener()
    {
         public void onClick(View v)
         {
             getProfile();
         }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.mainConsumer = new CommonsHttpOAuthConsumer(YAHOO_CONSUMER_KEY, YAHOO_CONSUMER_SECRET);
        this.mainProvider = new CommonsHttpOAuthProvider(REQUEST_TOKEN_ENDPOINT_URL, ACCESS_TOKEN_ENDPOINT_URL, AUTHORIZE_WEBSITE_URL);
        //this.mainConsumer.setSigningStrategy(new YahooAuthorizationHeaderSigningStrategy());

        // It turns out this was the missing thing to making standard Activity launch mode work
        //this.mainProvider.setOAuth10a(true);

        // get request
        button1 = (Button) this.findViewById(R.id.button1);
        button1.setOnClickListener(button1_onclick);

        // access token
        button2 = (Button) this.findViewById(R.id.button2);
        button2.setOnClickListener(button2_onclick);

        // guid
        button3 = (Button) this.findViewById(R.id.button3);
        button3.setOnClickListener(button3_onclick);

        // show token
        button4 = (Button) this.findViewById(R.id.button4);
        button4.setOnClickListener(button4_onclick);

        // Profile
        button5 = (Button) this.findViewById(R.id.button5);
        button5.setOnClickListener(button5_onclick);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        Toast.makeText(getApplicationContext(), "OnNewIntent - It works!",
                Toast.LENGTH_LONG).show();
        Uri uriData = intent.getData();
        if (uriData != null && uriData.toString().startsWith(YAHOO_CALLBACK_URL)) {
            setVerifier(uriData.getQueryParameter("oauth_verifier"));
        }
        super.onNewIntent(intent);
    }

    class OAuthRequestTokenTask extends AsyncTask<Void, Void, String> {

        final String TAG = getClass().getName();
        private Context context;
        private OAuthProvider provider;
        private OAuthConsumer consumer;

        public OAuthRequestTokenTask(Context context,OAuthConsumer consumer,OAuthProvider provider) {
            this.context = context;
            this.consumer = consumer;
            this.provider = provider;
        }

        @Override
        protected String doInBackground(Void... params) {

            try {
                Log.i(TAG, "Retrieving request token from Google servers");
                final String url = provider.retrieveRequestToken(consumer, YAHOO_CALLBACK_URL);
                Log.i(TAG, "Popping a browser with the authorize URL : " + url);
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                context.startActivity(intent);

                return url;
            } catch (Exception e) {
                Log.e(TAG, "Error during OAUth retrieve request token", e);
            }

            return null;
        }

        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(String result) {
            Log.i(TAG, "onPostExecute result : " + result);
            super.onPostExecute(result);

        } 
    }

    public class OAuthGetAccessTokenTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                mainProvider.retrieveAccessToken(mainConsumer, oAuthVerifier);
            } catch (OAuthMessageSignerException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (OAuthNotAuthorizedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (OAuthExpectationFailedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (OAuthCommunicationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            //super.onPostExecute(result);
            showToken();
        }

    }

    public void setVerifier(String verifier)
    {
        this.oAuthVerifier = verifier;
//      this.webview.loadData("verifier = " + this.OAuthVerifier + "<br>", "text/html", null);
        Log.d("setVerifier", verifier);

        this.showToken();
    }

    public void showToken()
    {
        //Log.d("SubPlurkV2", "Token = " + mainConsumer.getToken() + " and secret = " + mainConsumer.getTokenSecret());
        String str = 
                "verifier = " + this.oAuthVerifier + "<br>" + 
                "Token = " + mainConsumer.getToken() + "<br>" + 
                "secret = " + mainConsumer.getTokenSecret() + "<br>" + 
                "oauth_expires_in = " + mainProvider.getResponseParameters().getFirst("oauth_expires_in") + "<br>" +
                "oauth_session_handle = " + mainProvider.getResponseParameters().getFirst("oauth_session_handle") + "<br>" +
                "oauth_authorization_expires_in = " + mainProvider.getResponseParameters().getFirst("oauth_authorization_expires_in") + "<br>" + 
                "xoauth_yahoo_guid = " + mainProvider.getResponseParameters().getFirst("xoauth_yahoo_guid") + "<br>";
        Log.i("YahooScreen", "str : " + str);
    }

    private void doGet(String url) {
        OAuthConsumer consumer = this.mainConsumer;

        final HttpGet request = new HttpGet(url);
        Log.i("doGet","Requesting URL : " + url);
        try {
            consumer.sign(request);
            Log.i("YahooScreen", "request url : " + request.getURI());
            new Thread(new Runnable() {

                @Override
                public void run() {
                    DefaultHttpClient httpclient = new DefaultHttpClient();
                    HttpResponse response;
                    try {
                        response = httpclient.execute((HttpUriRequest) request);
                        Log.i("doGet","Statusline : " + response.getStatusLine());
                        InputStream data = response.getEntity().getContent();
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(data));
                        String responeLine;
                        StringBuilder responseBuilder = new StringBuilder();
                        while ((responeLine = bufferedReader.readLine()) != null) {
                            responseBuilder.append(responeLine);
                        }
                        Log.i("doGet","Response : " + responseBuilder.toString());
                        //return responseBuilder.toString();
                    } catch (ClientProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }).start();

        } catch (OAuthMessageSignerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void getGUID()
    {
        String GUID_URL="http://social.yahooapis.com/v1/me/guid?format=json"; 
        this.doGet(GUID_URL);
    }

    public void getProfile()
    {
        String guid = mainProvider.getResponseParameters().getFirst("xoauth_yahoo_guid");
        String url = "https://social.yahooapis.com/v1/user/" + guid + "/profile?format=json";
        this.doGet(url);
    }
}
公共类YahooScreen扩展活动{
私有静态最终字符串请求\u令牌\u端点\u URL=”https://api.login.yahoo.com/oauth/v2/get_request_token";
私有静态最终字符串AUTHORIZE\u WEBSITE\u URL=”https://api.login.yahoo.com/oauth/v2/request_auth";
私有静态最终字符串访问\u令牌\u端点\u URL=”https://api.login.yahoo.com/oauth/v2/get_token";
静态最终字符串YAHOO\u CALLBACK\u URL=“YOUR\u YAHOO\u CALLBACK\u URL”;
静态最终字符串YAHOO_CONSUMER_KEY=“YOUR_YAHOO_CONSUMER_KEY”;
静态最终字符串YAHOO_CONSUMER_SECRET=“YOUR_YAHOO_CONSUMER_SECRET”;
私有字符串验证程序;
CommonHttpOAuthConsumer主消费者;
CommonHttpOAuthProvider主提供程序;
私人按钮1;
私有OnClickListener按钮1\u onclick=new OnClickListener()
{
公共void onClick(视图v)
{
新的OAuthRequestTokenTask(v.getContext(),mainConsumer,mainProvider).execute();
}
};
私人按钮2;
私有OnClickListener按钮2\u onclick=new OnClickListener()
{
公共void onClick(视图v)
{
新的OAuthGetAccessTokenTask().execute();
}
};
私人按钮3;
私有OnClickListener按钮3\u onclick=new OnClickListener()
{
公共void onClick(视图v)
{
getGUID();
}
};
私人按钮4;
私有OnClickListener按钮4\u onclick=new OnClickListener()
{
公共void onClick(视图v)
{
showToken();
}
};
私人按钮5;
私有OnClickListener按钮5\u onclick=new OnClickListener()
{
公共void onClick(视图v)
{
getProfile();
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mainConsumer=newcommonHttpOAuthConsumer(YAHOO_CONSUMER_密钥,YAHOO_CONSUMER_密钥);
this.mainProvider=新的CommonHttpOAuthProvider(请求令牌端点URL、访问令牌端点URL、授权站点URL);
//this.main consumer.setSigningStrategy(新的YahooAuthorizationHeaderSigningStrategy());
//事实证明,这是使标准活动启动模式工作所缺少的东西
//this.mainProvider.setOAuth10a(true);
//获取请求
button1=(Button)this.findViewById(R.id.button1);
button1.setOnClickListener(button1\u onclick);
//访问令牌
button2=(Button)this.findViewById(R.id.button2);
button2.setOnClickListener(button2\u onclick);
//指南
button3=(Button)this.findViewById(R.id.button3);
button3.setOnClickListener(button3\u onclick);
//显示令牌
button4=(Button)this.findViewById(R.id.button4);
button4.setOnClickListener(button4\u onclick);
//侧面图
button5=(Button)this.findViewById(R.id.button5);
button5.setOnClickListener(button5\u onclick);
}
@凌驾
受保护的void onNewIntent(意图){
Toast.makeText(getApplicationContext(),“onneWinEvent-它可以工作!”,
Toast.LENGTH_LONG).show();
Uri uriData=intent.getData();
if(uriData!=null&&uriData.toString().startsWith(YAHOO_CALLBACK_URL)){
setVerifier(uriData.getQueryParameter(“oauth_verifier”);
}
super.onNewIntent(意向);
}
类OAuthRequestTokenTask扩展了AsyncTask{
最后一个字符串标记=getClass().getName();
私人语境;
私有OAuthProvider;
私人消费者;
公共OAuthRequestTokenTask(上下文上下文、OAuthConsumer使用者、OAuthProvider提供者){
this.context=上下文;
这个。消费者=消费者;
this.provider=提供者;
}
@凌驾
受保护字符串doInBackground(无效…参数){
试一试{
i(标记,“从Google服务器检索请求令牌”);
最终字符串url=provider.RetrieverRequestToken(消费者,YAHOO_回调_url);
i(标记“弹出带有授权URL的浏览器:“+URL”);
Intent Intent=newintent(Intent.ACTION_视图,Uri.parse(url));
背景。开始触觉(意图);
返回url;
}捕获(例外e){
e(标记“OAUth检索请求令牌时出错”,e);
}
返回null;
}
/*(非Javadoc)
*@see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@凌驾
受保护的void onPostExecute(字符串结果){
Log.i(标记“onPostExecute结果:”+result);
super.onPostExecute(结果);
} 
}
公共类OAuthGetAccessTokenTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…arg0){
试一试{
mainProvider.retrieveAccessToken(mainConsumer、oAuthVerifier);
}捕获(OAuthMessageSignerException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(OAuthNotAuthorizedException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(OAutheExpectationFailedException e){
//TODO自动生成的捕捉块
e、 printStackTrace()