在网上找了很久也没有发现比较好的android微博客户端可以提供学习…有的也是非常老旧了…磨擦磨擦…完全跟不上时期的步伐.1怒之下,vio微博应运而生.
duang…
言归正传…新浪微博目前所采取的授权机制,已完全抛弃了OAuth1.0 ,转向OAuth2.0.那末怎样进行OAuth2.0的认证呢?
首先,我们了解1下OAuth2.0: OAuth2.0是1个全新的协议,对之前的版本不进行向后兼容,但OAuth2.0的整体架构与之前的OAuth架构却是相同的.
OAuth2.0的认证流程:
(1)用户打开客户端以后,客户端要求用户给予授权
(2)用户同意给予客户端授权
(3)客户端使用上1步取得的授权,向认证服务器申请令牌
(4)认证服务器对客户端进行认证以后,确认无误,同意发放令牌
(5)客户端使用令牌,向资源服务器申请获得资源
(6)资源服务器确认令牌无误,同意向客户端开放资源
OAuth2.0客户端授权模式包括:
①授权码模式(authorization code)
②简化模式(implicit)
③密码模式(resource owner password credentials
④客户端模式(client credentials)
授权码模式:
―> 用户访问客户端,客户端指向服务器(
参数:response_type:表示授权类型,必选项,此处的值固定为”code”
client_id:表示客户真个ID,必选项(新浪微博app_key)
redirect_uri:表示重定向URI,可选项(新浪微博提供默许url)
scope:表示申请的权限范围,可选项(可参照sdkdemo)
state:表示客户真个当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。)
―> 用户选择是不是授权
―> 获得用户后,将用户导向到redirect_uri,返回授权码code
―> (此步骤用户不可见) 利用服务器授权码,向服务器申请1个access_token
―> 认证服务器核对了授权码和重定向URI,无误以后,返回参数(
参数:access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
refresh_token:表示更新令牌,用来获得下1次的访问令牌,可选项。
scope:表示权限范围,如果与客户端申请的范围1致,此项可省略)
我们使用的便是这类方式:其他3种此处不做介绍:(有兴趣参考:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
下面我们看1下我的vio微博的认证:
首先: 打开新浪微博开放平台(http://open.weibo.com/) 完善个人信息 创建利用…
(如果是创建第2个利用,点击微连接,移动利用就OK)
android签名需要在现在sdk_demo中获得app_signatures.apk输入包名获得.下载地址:https://github.com/sinaweibosdk/weibo_android_sdk
值得注意的是之高级设置中需要按以下设置(固然若是大神自动可躲避):
申请流程就到这里,以上是注意点.建议大家揣摩1下demo,好处多多.
新建vio微博工程,在微博sdk中导入以下.so文件及weibosdkcore.jar文件
本人不喜欢项目依赖,所以之间拷了过来.大家如果能接受,直接将weibosdk设为依赖.
authInfo = new AuthInfo(this, WeiBoConfig.APP_KEY, WeiBoConfig.REDIRECT_URL, WeiBoConfig.SCOPE);
ssoHandler = new SsoHandler(this, authInfo);
Button btnLogin = (Button) findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ssoHandler.authorize(new AuthListener());
}
});
class AuthListener implements WeiboAuthListener{
private Oauth2AccessToken accessToken;
@Override
public void onCancel() {
Log.d(TAG, "授权取消");
}
@Override
public void onComplete(Bundle arg0) {
accessToken = Oauth2AccessToken.parseAccessToken(arg0);
if (accessToken.isSessionValid()) {// 判断accessToken是不是有效
Log.d(TAG, "uid = " + accessToken.getUid());
Log.d(TAG, "token = " + accessToken.getToken());
Log.d(TAG, "refreshtoken = " + accessToken.getRefreshToken());
Log.d(TAG, "expirestime = " + accessToken.getExpiresTime());
}else {
Log.d(TAG, "accessToken无效");
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的利用程序的包名与签名时;
// 2. 当您注册的利用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的利用的包名和签名不匹配时。
String code = arg0.getString("code");
code = TextUtils.isEmpty(code) ? "未知code" : code;
Log.d(TAG, "未获得到有效的accessToken, 毛病码code = " + code);
}
}
@Override
public void onWeiboException(WeiboException arg0) {
Log.d(TAG, "产生异常 : " + arg0.getMessage());
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SSO 授权回调
// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResult
if (ssoHandler != null) {
ssoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
这是获得授权最简单的方式…… 本人比较懒,就直接调用了sdk.勿喷.
ssoHandler.authorize(new AuthListener()); 这类方式默许调用微博客户端授权,若用户手机上没有微博客户端,则实用web方式授权.