最近学习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(); } }); }