目前微博SDK为开发者提供三种授权方式:
SSO授权:有客户端时使用 SSO 授权登陆;无客户端时自动唤起 Web 授权
Web 授权:在没有客户端的情况下,可直接使用该授权
Code码授权:无须应用的包名和签名,通过应用的APP_KEY和APP_SECRET授权
为了简单起见,我们使用了Code码授权
准备工作:
1、申请应用程序的APP_KEY
用户首先需要在微博开放平台上对应用进行注册,并获取APP_KEY,添加应用的授权回调页(Redirect URI)
这里我直接使用新浪微博Android SDK中的APP_KEY和授权回调页
public interface Constants {
public static final String APP_KEY = "2045436852"; // 应用的APP_KEY
public static final String REDIRECT_URL = "http://www.sina.com";// 应用的回调页
public static final String SCOPE = // 应用申请的高级权限
"email,direct_messages_read,direct_messages_write,"
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
+ "follow_app_official_microblog," + "invitation_write";
}
2、集成新浪微博Android SDK
有两种方式:
(1) 直接导入weibosdkcore.jar:适用于只需要授权、分享、网络请求框架功能的项目
(2) 引用WeiboSDK工程(Library):适用于微博授权、分享,以及需要登陆按钮、调用OpenAPI的项目
3、授权主要API
(1)认证授权类
mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
(2)实现WeiboAuthListener接口
授权成功后,SDK会将access_token、expires_in、uid等通过Bundle的形式返回,在onComplete函数中,可以获取该信息。
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
mAccessToken = Oauth2AccessToken.parseAccessToken(values); // 从 Bundle 中解析 Token
if (mAccessToken.isSessionValid()) {
AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken); //保存Token
.........
} else {
// 当您注册的应用程序签名不正确时,就会收到错误Code,请确保签名正确
String code = values.getString("code", "");
.........
}
}
.........
}
(3)直接调用WeiboAuth#anthorize方法,获取Code码:mWeiboAuth.authorize(new AuthListener(), WeiboAuth.OBTAIN_AUTH_CODE); //不需要应用包名和签名
(4)通过Code码与app_secret,进行HTTP请求,获取Token:fetchTokenAsync(mCode, WEIBO_DEMO_APP_SECRET); //通过应用的APP_SCRET来实现授权
public void fetchTokenAsync(String authCode, String appSecret)
{
WeiboParameters requestParams = new WeiboParameters();
requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_ID, Constants.APP_KEY);
requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_SECRET, appSecret);
requestParams.put(WBConstants.AUTH_PARAMS_GRANT_TYPE,
"authorization_code");
requestParams.put(WBConstants.AUTH_PARAMS_CODE, authCode);
requestParams.put(WBConstants.AUTH_PARAMS_REDIRECT_URL,
Constants.REDIRECT_URL);
// 异步请求,获取 Token
AsyncWeiboRunner.requestAsync(OAUTH2_ACCESS_TOKEN_URL, requestParams,
"POST", new RequestListener()
{
@Override
public void onComplete(String response)
{
LogUtil.d(TAG, "Response: " + response);
Oauth2AccessToken token = Oauth2AccessToken
.parseAccessToken(response);
if (token != null && token.isSessionValid())
{
LogUtil.d(TAG, "Success! " + token.toString());
mCurUser = new UserInfo();
mAccessToken = token;
mCurUser.setUserId(mAccessToken.getUid());
mCurUser.setToken(mAccessToken.getToken());
mCurUser.setUserExpiresin(mAccessToken.getExpiresTime());
mUsersAPI = new UsersAPI(mAccessToken);
long uid = Long.parseLong(mAccessToken.getUid());
mUsersAPI.show(uid, mListener);
} else
{
LogUtil.d(TAG, "Failed to receive access token");
}
}
@Override
public void onWeiboException(WeiboException e)
{
LogUtil.e(TAG, "onWeiboException: " + e.getMessage());
Toast.makeText(LoginActivity.this, "获取Token失败",
Toast.LENGTH_SHORT).show();
}
});
}
获取到Token后就保存到数据库中,下次登录就不用认证了。