也学微博开发(三)修正--认证登录
前言
关于登录问题之前一直找不到错误出自哪里,为什么总是显示登录中却总也成功不了,单步调试后
还是不得其解。百度了一下又在新浪开放API的文档里转了转,才发现教程中微博客户端登录的方式已经淘汰了,
现在用的是Oauth认证方式。于是下来SDK重新做过。
实现流程
一、 什么是Oauth认证
首先当然是搞清楚什么是Oauth认证方式,百度一下就清楚了。和计算机网络里的三次握手有那么点相似的味道,
引用一下网上介绍较多的说法:
第一组:(App Key和App Secret、CallBackUrl)
第二组:(Request Token和Request Secret)
第三组:(oauth_verifier)
第四组:(user_id、Access Token和Access Secret)
步骤(1):新浪微博的OAuth认证过程,当用户第一次使用本客户端软件时,客户端程序用第一组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软件同时表示新浪微博信任本客户端软件
步骤(2):当客户端软件获取第二组参数时作为参数引导用户浏览器跳至新浪微博的授权页面,然后用户在新浪的这个授权页面里输入自己的微博账号和密码进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件,并表示用户也信任本客户端软件
步骤(3):接下来客户端软件把第二组参数和第三组参数作为参数再次向新浪微博发起请求,然后新浪微博返回第四组参数给客户端软件。据这3个值直接调用新浪的api接口获取相应用户的信息并进行发微博等操作。第四组参数需要好好的保存进XML,下次使用时便可绕过OAuth认证,直接使用第四组参数值进行微博的相关应用。
从这个过程来看用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户和密码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了账户和密码透露给新浪微博之外的第三方应用程序,保证了安全性。
看完之后还是有点晕,主要是那些参数,有好几对,本人根据大概意思结合新浪的命名画了张图认证过程流程:
这图大概意思差不多,详细的话google,baidu吧。
二、修改SDK
废话讲完,现在可以把下来的SDK导入Eclipse,我用的是新浪Android SDK,下载完解压,
1.导入后会有错误提示:网上有篇文章介绍的很清楚,作者是好像是“菜鸟521”(他总结的很好)
1.最简单的删除assets文件夹下的说明文档《Android平台微博SDK说明文档》,或者该成英文名。
2.在AuthorizeActivity.java中将CONSUMER_KEY和CONSUMER_SECRET分别赋值成在新浪微博申请到的那对值:App Key,App Secret。
3.在AuthorizeActivity.java中有句代码有问题将语句
eibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_KEY);
修改成 weibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_SECRET);
2.我做完这几步后,项目没有错误提示了,现在把上次的欢迎界面(在Logo.java文件里面实现),copy到这个项目,
并且在AndroidManifest文件中设为启动入口。
现在修改AuthorizeActivity文件,为CONSUMER_KEY和CONSUMER_SECRET 赋值。
private static final String CONSUMER_KEY = "XXXXXX";
private static final String CONSUMER_SECRET = "XXXXXXXXX";
3.新建一个activity,命名为MainActivity.java,并且在AndroidManifest文件中加进去:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="MainActivity" android:scheme="weiboandroidsdk" /> </intent-filter> </activity>
这最重要的一句是<data />标签里的,定义当前MainActivity的uri,用作请求服务器时的回调uri,
这个回调也就是说,用户在浏览器中的新浪页面输入用户名和密码后,将返回这个位置。
4.用户登录成功,返回MainActivity,我希望立刻显示微博用户所关注的用户的状态,向服务器发送friends_timeline请求,
在SDk的TestActivity代码基础上修改,增加的关键代码如下:
String s = getFriendTimeline(mWeibo);
try
{
JSONArray jsonArray = new JSONArray(s);
for (int i = 0; i < jsonArray.length(); i++)
{
JSONObject item=jsonArray.getJSONObject(i);
String idString=item.getString("Id");
String textString=item.getString("Text");
Log.i(TAG, idString+":"+textString);
}
} catch (JSONException e)
{
e.printStackTrace();
}
mResult.setText(s);
Log.i(TAG, "好友状态:" + s);
private String getFriendTimeline(Weibo weibo) throws MalformedURLException, IOException, WeiboException
{
String url = Weibo.SERVER + "statuses/friends_timeline.json";
WeiboParameters bundle = new WeiboParameters();
bundle.add("source", Weibo.APP_KEY);
String rlt = weibo.request(this, url, bundle, "GET", mWeibo.getAccessToken());
return rlt;
}
5.到目前为止,已经实现用户登录微博,并且获取好友说说,显示在前台的功能,但是还非常简陋,继续学习。
写的不对的欢迎各位也在学习android的朋友拍砖,大家交流交流,源码等都完善了在发出来。
效果图