编写微博客户端,最重要的就是用户授权方法。现在主流SNS社区开放API后,基本都采用OAuth认证进行授权。本文主要记录新浪微博1.0a版本的OAuth认证。但是随着2.0版本的逐渐普及,会在今后的加入2.0版本的方法。
有关OAuth认证的理论及相应流程在这里不做过多追述,各大网站上都已经写的十分清晰,这里主要写下我自己的实现方法。对于OAuth认证,这里采用signpost-oauth开源项目。
首先编写一个类,用于存储认证过程中需要用到基本信息。
public class SinaConstant {// 新浪OAuth辅助信息类
// 所分配的APP_KEY
public static final String CONSUMER_KEY = "";
// 所分配的APP_SECRET
public static final String CONSUMER_SECRET = "";
// 用于获取未授权的request token
public static final String REQUEST_URL = "http://api.t.sina.com.cn/oauth/request_token";
// 用于获取access token
public static final String ACCESS_URL = "http://api.t.sina.com.cn/oauth/access_token";
// 用于对未授权的request token进行授权
public static final String AUTHORIZE_URL = "http://api.t.sina.com.cn/oauth/authorize";
// 回调地址
public static final String OAUTH_CALLBACK_URL = "mysina://CallActivity";
}
注:1、其中回调地址用于指向从新浪页面授权后跳转到页面;2、对应的key和secret填写新浪微博对应提供的app_key及app_secret
建立一个Activity用于进行添加账号的操作。将改Activity设置为单例模式
<activity
android:label="@string/app_name"
android:launchMode="singleInstance" android:name=".AddUserActivity" >
<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="CallActivity"
android:scheme="mysina" />
</intent-filter>
</activity>
注:1、android:launchMode="singleInstance"将该Activity设置为单例;2、data标签与SinaConstant类中的回调地址对应,用于从浏览器回传值时呼出该Activity
建立AddUserActivity,对应代码如下:
public class AddUserActivity extends Activity {
/** Called when the activity is first created. */
Context context;
private OAuthConsumer sinaconsumer;
private OAuthProvider sinaprovider;
private OAuthRequestToken oauthtool;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.usermanager);
sinaconsumer = new CommonsHttpOAuthConsumer(SinaConstant.CONSUMER_KEY,SinaConstant.CONSUMER_SECRET);//初始化用于OAuth认证的Consumer对象
sinaprovider = new CommonsHttpOAuthProvider(SinaConstant.REQUEST_URL,SinaConstant.ACCESS_URL, SinaConstant.AUTHORIZE_URL);//初始化用于OAuth认证的Provider对象
ImageButton adduser = (ImageButton) findViewById(R.id.addUserImage);this.context = this;
adduser.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("OAuth认证新浪");
oauthtool = new OAuthRequestToken(context, sinaconsumer,sinaprovider);
oauthtool.execute();
}
});
}
protected void onNewIntent(Intent intent) {//AddUserActivity为单例,再第二次开启时加载该方法
super.onNewIntent(intent);
Uri uri = intent.getData();
String verifier = null;
verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
sinaprovider.setOAuth10a(true);//设置OAuth版本号
sinaprovider.retrieveAccessToken(sinaconsumer, verifier);//通过服务器返回的Verifier去获取账号对应的Token
SortedSet<String> user_ids = sinaprovider.getResponseParameters().get("user_id");
String user_id = user_ids.first();
String Token= sinaconsumer.getToken();
String TokenSecret = sinaconsumer.getTokenSecret();
System.out.println(userKey + "&*&" + userSecret);
} catch (Exception e) {
e.printStackTrace();
}
}
注:1、在OnNewIntent方法中,sinaprovider.retrieveAccessToken()需要与网路交互,最好采取异步操作,本代码中忽略,异步方法可以参考在onClickListener监听中的OAuthRequestToken。
我们可以在上面的代码中看到,我们已经获取到相应的Token及TokenSecret了。通过这2个值,我们技能对授权账号进行操作,获取账号信息,发送微博,获取微博,更新资料等。
在第一步认证中,用到了一个异步类OAuthRequestToken,代码如下 :
public class OAuthRequestToken extends AsyncTask<String, Void, String> {
private OAuthConsumer consumer;
private OAuthProvider provider;
private Context context;
private ProgressDialog pd;
public OAuthRequestToken(Context context, OAuthConsumer consumer,
OAuthProvider provider) {
this.context = context;
this.consumer = consumer;
this.provider = provider;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
// if(type.equalsIgnoreCase("sina")){
try {
Uri uri = null;
// retrieveRequestToken的第二个参数是回调URL
final String url = provider.retrieveRequestToken(consumer,SinaConstant.OAUTH_CALLBACK_URL);
System.out.println(consumer.getToken());
uri = Uri.parse(url);
context.startActivity(new Intent(Intent.ACTION_VIEW, uri));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
return "success";
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
pd.dismiss();
if(result == null){
Toast.makeText(context, "网络异常,请稍后重试", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new ProgressDialog(context);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("正在加载");
pd.show();
}
}
OAuth认证,在本文中是通过调用系统浏览器到新浪微博指定地址进行授权,如果使用UCWeb之类的浏览器可能会出现无法回调的异常。所以建议使用WebView来实现授权页面。相应的方法会在后面写到。
分享到:
相关推荐
1.腾讯微博Android客户端开发——OAuth认证学习.pdf 1.腾讯微博Android客户端开发——OAuth认证学习.pdf
适用于Android的AppAuth是用于与和提供程序进行通信的客户端SDK。 它努力遵循那些惯用的实现语言样式,直接映射那些规范的请求和响应。 除了映射原始协议流外,便捷方法还可用于协助执行常见任务,例如使用新令牌...
腾讯微博Android客户端开发——OAuth认证学习,课程下载地址:http://blog.csdn.net/coolszy
腾讯微博Android客户端开发OAuth认证学习[收集].pdf
使用OkHttp的Android OAuth2客户端
腾讯微博android 客户端 Oauth 认证流程序示例
3./class/下,文件名中含有If的文件,定义的是接口.总计3个接口文件:各个网站的api访问路径(urlIf)、申请到的appkey接口(keyIf),返回的参数名接口(paramIf)。...本例中的OAuth客户端来源于新浪微博OAuth认证SDK。
Java的oauth2.0 服务端与客户端的实现.zip 封装了oauth2.0的基本架构和实现,对照我的博客http://blog.csdn.net/jing12062011/article/details/78147306使用该源码。 下载项目压缩包,解压,里面两个maven项目:...
新浪、腾讯、网易、搜狐微薄OAuth认证整合Android版
OAuth认证协议原理及使用方法 OAuth认证协议原理及使用方法
java源码:API访问授权的开放标准 OAuth.zip
Android OAuth2 客户端当前使用自签名证书和客户端证书处理资源所有者流程。 编写此库是为了解决已发布的现有 OAuth 库的一些问题。 这是使用应用程序中的嵌入式证书成功连接到 Azure 实例 WHO 初始版本 - Bryan ...
该库还支持OAuth的扩展,该扩展是在使用自定义URI方案重定向时创建的,用于保护公共客户端中的授权代码。 该库对其他扩展(标准或其他扩展名)友好,能够处理所有协议请求和响应中的其他参数。 例子 src/node_app...
oauth认证服务器端和客户端 oauth实例 sparklr tonr
Android版新浪、网易、腾讯、搜狐微博OAuth认证实例集,想更多了解OAuth认证的朋友,请下载java源码包,在示例中完整解析了OAuth认证的过程:定义URL编码方式,请求url,得到注册应用后服务商提供的key和secret,...
sina oauth 认证 android移动开发实例 希望大家可以参考下
OAuth认证整合Android版-demo示例初学者
一个OAuth2客户端,它发送一个oauth2Response对象作为输出。 输入项 任何触发产生oauth2Response的消息。 容器 将接收消息oauth2Response对象的容器的名称。 ps msg.payload.oauth2Response object 赠款类型 ...
angular-oauth, 客户端( 隐式授权) OAuth gnu 2.0授权流 这里项目提供客户端( 隐式授权) OAuth 2.0授权流的实现。特性使用基于的Token.getTokenByPopup() 函数检索用户的令牌,将用户提供授权终结点并异步返回令牌。...
android上的新浪、腾讯、人人、豆瓣、facebook的oauth认证的学习例子,主要是提供源码例子学习,也欢迎各种技术改造。