在网上找了很久也没有发现比较好的android微博客户端可以提供学习…有的也是非常老旧了…摩擦摩擦…完全跟不上时代的步伐.一怒之下,vio微博应运而生.
duang…
言归正传…新浪微博目前所采用的授权机制,已经完全抛弃了OAuth1.0 ,转向OAuth2.0.那么怎么进行OAuth2.0的认证呢?
首先,我们了解一下OAuth2.0: OAuth2.0是一个全新的协议,对之前的版本不进行向后兼容,但OAuth2.0的整体架构与之前的OAuth架构却是相同的.
OAuth2.0的认证流程:
(1)用户打开客户端以后,客户端要求用户给予授权
(2)用户同意给予客户端授权
(3)客户端使用上一步获得的授权,向认证服务器申请令牌
(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
—> (此步骤用户不可见) 利用服务器授权码,向服务器申请一个access_token
—> 认证服务器核对了授权码和重定向URI,无误之后,返回参数(
参数:access_token:表示访问令牌,必选项。
token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
scope:表示权限范围,如果与客户端申请的范围一致,此项可省略)
我们使用的便是这种方式:其他三种此处不做介绍:(有兴趣参考:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
下面我们看一下我的vio微博的认证:
首先: 打开新浪微博开放平台(http://open.weibo.com/) 完善个人信息 创建应用…
(如果是创建第二个应用,点击微连接,移动应用就OK)
android签名需要在现在sdk_demo中获取app_signatures.apk输入包名获取.下载地址:https://github.com/sinaweibosdk/weibo_android_sdk
值得注意的是之高级设置中需要按如下设置(当然若是大神自动可回避):
申请流程就到这里,以上是注意点.建议大家琢磨一下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方式授权.