最近學習Android開發,照着視頻開發新浪微博,可是視頻裏的介紹的是OAuth1.0的受權方式,試了半天發現用不了。java
原來如今通常沒審覈的用戶只能使用OAuth2.0了,視頻教學裏的方法已通過時了。因而只好本身研究如何進行微博認證。app
OAuth2.0的受權過程異步
說白了,就是請求獲取Grant Code→使用Grant Code申請Access Token→之後就使用這個Access Token獲取微博的服務,這比OAuth1.0的受權方式簡化了很多。ide
若是不使用別的第三方OAuth認證的庫或者本身開發認證方法的話,初入門能夠直接使用新浪提供的SDK,簡單方便,並且說明詳細。學習
http://open.weibo.com/wiki/SDK#Android_SDK這個地址下載新浪的sdk庫weibosdkcore.jarfetch
而後倒入到Android的項目中ui
將官方的提供SDK JAR包(weibosdkcore.jar)放到工程的libs目錄下
添加JAR包:工程→右鍵→properties→java build path→libraries→add external jarthis
新浪的這個SDK支持三種方法的認證,SSO認證、Web認證、Code認證。這個Code認證就是不少教學視頻裏使用的根據APP_KEY和APP_SECRET獲取Token和Token_secret的方法。另外兩個方法本身研究吧。spa
使用新浪的SDK完成認證就是兩句話code
Scope說明能夠看http://open.weibo.com/wiki/Scope#scope.E8.AF.B4.E6.98.8E
1 WeiboAuth wa = new WeiboAuth(OAuthActivity.this, APP_KEY, REDIRECT_URL, "all");//最後一個參數是Scope 2 wa.authorize(new AuthListener(),WeiboAuth.OBTAIN_AUTH_CODE);//這個AuthListener是要本身實現的
獲取Grant Code
AuthListener是繼承WeiboAuthListener的一個實現,當輸入完成帳號密碼,完成受權後就會回調這個實現。
public class AuthListener implements WeiboAuthListener { /** 封裝了 "access_token","expires_in","refresh_token",並提供了他們的管理功能 */ private Oauth2AccessToken mAccessToken; @Override public void onCancel() { Log.i("AuthListener","----auth canceled"); } /** * 微博認證受權回調類。 * 1. SSO 受權時,須要在 {@link #onActivityResult} 中調用 {@link SsoHandler#authorizeCallBack} 後, * 該回調纔會被執行。 * 2. 非 SSO 受權時,當受權結束後,該回調就會被執行。 * 當受權成功後,請保存該 access_token、expires_in、uid 等信息到 SharedPreferences 中。 */ @Override public void onComplete(Bundle arg0) { // 從 Bundle 中解析 Code if (null == arg0) { Log.e("AuthListener", "obtain auth code fail!"); return; } String code = arg0.getString("code"); mCode = code; if (TextUtils.isEmpty(code)) { Log.e("AuthListener", "obtain auth code fail!"); return; } //進行受權的下一步 fetchTokenAsync(mCode, APP_SECRET);//這是異步獲取Token } @Override public void onWeiboException(WeiboException arg0){ Log.i("AuthListener","----"+arg0.getMessage()); } }
獲取Access Token
獲取Token,若是成功,那麼受權就完成了。
/** * 異步獲取 Token。 * * @param authCode 受權 Code,該 Code 是一次性的,只能被獲取一次 Token * @param appSecret 應用程序的 APP_SECRET,請務必妥善保管好本身的 APP_SECRET, * 不要直接暴露在程序中,此處僅做爲一個DEMO來演示。 */ public void fetchTokenAsync(String authCode, String appSecret) { WeiboParameters requestParams = new WeiboParameters(); requestParams.put("client_id", APP_KEY); requestParams.put("client_secret", appSecret); requestParams.put("grant_type", "authorization_code"); requestParams.put("code", authCode); requestParams.put("redirect_uri", REDIRECT_URL); // 異步請求,獲取 Token AsyncWeiboRunner.requestAsync(ACCESS_TOKEN_URL, requestParams, "POST", new RequestListener() { @Override public void onComplete(String response) { Log.d(TAG, "Response: " + response); // 獲取 Token 成功,Oauth2AccessToken是一個封裝了"access_token","expires_in","refresh_token"的類 Oauth2AccessToken token = Oauth2AccessToken.parseAccessToken(response); if (token != null && token.isSessionValid()) { Log.d(TAG, "Success! " + token.toString()); mAccessToken = token; Toast.makeText(OAuthActivity.this, "受權成功 Token="+token.getToken(), Toast.LENGTH_SHORT).show(); } else { Log.d(TAG, "Failed to receive access token"); } } @Override public void onWeiboException(WeiboException e) { Log.e(TAG, "onWeiboException: " + e.getMessage()); Toast.makeText(OAuthActivity.this, "受權異常" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }); }