使用Oauth在android中调用yahoo api
我想使用Yahoo API在Android中获取登录用户的电子邮件。我已经获得了访问令牌和用户GUID,但获取用户电子邮件的下一步不起作用 我收到了以下回复信息:使用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
{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()