引言 新浪微博的oauth 更多功能 总结 参考资料
最近不是太忙,花了一些时间学习android的应用开发。经过两个星期的学习,学习的同时还写了很多的demo示例,可以从 下载。
今天的内容从这个星期开始,准备拿新浪微博开放平台做个实践,开发一个功能简单的android客户端,会尽可能的完善功能。
上图是这个客户端的主要界面,目前只是获取了前20条数据,还可以通过refresh点击刷新数据。功能还比较简单。运行的系统是android2.2.
关于OAuth验证使用到的技术点包括ListView,自定义ListAdapter,多线程相关的Message,Handler,验证相关的OAuth,用户图片的异步加载。新浪微博的验证使用的是signpost的OAuth组件,没有使用微博的SDK。源码下载:
OAuth是当下流行的授权方案,twitter,facebook,google等大型网站的开放平台都支持了oauth验证模式,国内的新浪微博、腾讯微博、163微博的开放平台也相继支持了这种验证模式。引用维基百科的相关说明“oauth是一个开放的标准,允许用户让第三方应用访问该用户放在某一个网站的私密资源,而无需将用户名和密码传递给第三方应用。oauth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。”举例来说就是:用户A在服务提供者B上存放了一些资源,B支持oauth授权模式,A在B上是注册用户,有用户名和密码,使用用户名和密码登陆B就可以查看自己的资源。假设有一个应用C,用户A在使用C的时候需要自己在B上存放的资源。有两种方法来实现C上显示自己在B上的资源。
- 一种是在C上输入自己在B的用户名和密码,让C帮自己登陆,获取资源,然后显示在C上,但是这么做太不放心了,C是一个什么样的应用,用户A不放心把B的用户名和密码交给C。
- 第二种是在C上也存放一份相关资源,这样C就直接显示用户A在C上的资源就可以了。这样的话,用户的维护量就会很大,资源的同步更新很让人头疼的。
这时候C就可以使用B开放的oauth授权机制了,用户A在想要显示B上的资源的时候,C会跳转到B的验证页面,用户在B的页面输入用户名和密码,通过之后,会询问用户是否开发相关的资源给C应用,用户可以自定义C可以访问的资源,然后再跳转回C应用。这样既不用担心用户名和密码的问题,又不用同时存放多份资源造成的维护问题了。大家可以通过下面的网站详细了解oauth的具体技术细节。
从上图我们可以看出,真个过程分为consumer和provider两个部分。consumer也就是例子中的c应用,provider就是例子中的B服务提供者。使用OAuth进行认证和授权的过程如下所示:
- 用户访问客户端的网站,想操作用户存放在服务提供方的资源。
- 客户端向服务提供方请求一个临时令牌。
- 服务提供方验证客户端的身份后,授予一个临时令牌。
- 客户端获得临时令牌后,将用户引导至服务提供方的授权页面请求用户授权。在这个过程中将临时令牌和客户端的连接发送给服务提供方。
- 用户在服务提供方的网页上输入用户名和密码,然后授权该客户端访问所请求的资源。
- 授权成功后,服务提供方引导用户返回客户端的网页。
- 客户端根据临时令牌从服务提供方那里获取访问令牌。
- 服务提供方根据临时令牌和用户的授权情况授予客户端访问令牌。
- 客户端使用获取的访问令牌访问存放在服务提供方上的受保护的资源。
借用一张新浪微博的oauth验证流程图。我们再新浪微博开放平台新建应用的时候都会分配给新建应用一个key和secret,也就是consumerKey和consumerSecret。通过这两个东西,我们去request_token,然后将用户重定向到新浪微博平台的授权页面,授权之后,根据callback_url跳转会我们应用的一个地址,我们再次使用request_token获取access_token,在后面就需要通过access token来访问开放平台提供的需要验证的接口了。当然了,那些不需要验证就可以访问的接口,就直接使用key就可以访问了,详情可以参考开放平台提供的API文档。腾讯微博和163微博的开放平台也是类似的原理和实现。package com.sinaweibo2;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
public class OAuth {
private OAuthConsumer mConsumer;
private OAuthProvider mProvider;
public static final String CALLBACK_URL = "sinaweibo2://WeiboListActivity"; public static final String CONSUMER_KEY = "1849239616"; public static final String CONSUMER_SECRET = "b2137bf782bf6cae004b8a8394d5d5d6"; public static final String REQUEST_TOKEN_URL = "http://api.t.sina.com.cn/oauth/request_token"; public static final String ACCESS_TOKEN_URL = "http://api.t.sina.com.cn/oauth/access_token"; public static final String AUTHORIZE_URL = "http://api.t.sina.com.cn/oauth/authorize"; public OAuth() { } public String RetrieveAuthUrl() throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException, OAuthCommunicationException { mConsumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); mProvider = new CommonsHttpOAuthProvider(REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, AUTHORIZE_URL); String authUrl= mProvider.retrieveRequestToken(mConsumer, CALLBACK_URL); return authUrl; } public void RetrieveAccessToken(String verifier) throws OAuthMessageSignerException, OAuthNotAuthorizedException, OAuthExpectationFailedException, OAuthCommunicationException { mProvider.setOAuth10a(true); mProvider.retrieveAccessToken(mConsumer, verifier); OAuthUser.USER_ID=mProvider.getResponseParameters().getFirst("user_id"); OAuthUser.ACCESS_TOKEN = mConsumer.getToken(); OAuthUser.ACCESS_TOKEN_SECRET = mConsumer.getTokenSecret(); } }
接下来,有两个主要的功能会完善,一个是分页浏览,一个是发表微博。往后,可能会支持图片发表等实用功能。还有就是UI的美化,性能的优化。
学习的过程中看过两本书,Pro.Android.2.pdf和Professional.Android.2.Application.Development.(Wrox,.2010,.0470565527).pdf,都是很不错的入门书籍。书我没有全看完,看完大部分吧,边看边写demo。同时每天泡论坛 ,eoe的开发者门户。回答问题,解决问题,提出问题,发帖子,总之就是锻炼自己,强迫自己锻炼基础和思考。在论坛上,有很多的中文pdf教程,但是发现大多都是翻译 的Dev Guide和Resources中的内容。所以觉得,如果英文不是很差,建议直接阅读上面的两个板块,同时练习其中的示例,保证两个星期,你会有很大的进步。
Technorati 标签: , , ,