您的位置:首页 > 其它

实现新浪微博授权一次多次登录的功能

2013-01-07 12:21 579 查看
目录(?)[-]

实现新浪微博授权一次多次登录的功能

原文有删改原文地址Android笔记 Sina API保存Oauth验证信息

正文
客户端的验证授权Resource Owner Password Credentials
高级接口及特殊权限

实现新浪微博授权一次多次登录的功能

原文有删改,原文地址:[Android笔记]
Sina API保存Oauth验证信息


感慨:

对于入手开发基于Sina Weibo客户端的开发人员来说,最大感慨我想就是文档 + 代码 + API接口

1、文档解释不全

2、代码注释很少

3、API 听说很多都遇到 API 封闭情况或者异常!(至少我没遇到)

不过丝毫没有消灭开发者的热情,因为 --> 微博很火!

4.由于新浪强制用户从V1接口转到V2接口,而V2接口中access Token新增了有效期,更多 资料:http://blog.csdn.net/logan676/article/details/7880274

正文:

基于 WeiBo API 开发一系列工作,流程:

1、先到 Open Weibo 注册开发者帐号信息,获取 APP_KEY, APP_SECRET

2、查看 Sina 提供的 API ,不过最好下 SDK 看,因为很快就能上手,如果有时间,要看一下他们的源代码 ^_^

3、了解 Oauth、Basic Oauth, Xauth ..
and so on!

下面是开始着手开发:我想实现微博登录然后发微博,@其他用户

SDK 的目录结构:

---- com_weibo_android (这是一个Liberary)

---- com_weibo_android_example(主要Activity)

在 com_weibo_android_example 中 AuthorizeActivity.java OnClick 方法中提供了3种授权方式:

OAuth2.0隐式授权认证方式, OAuth2.0认证方式, Xauth认证方式

写了一个 WeiboUtil.java 操作类,用 OAuth2.0隐式授权认证方式 来验证,很简单,依葫芦画瓢嘛

[java]
view plaincopy

// consumer_key, consumer_secret, callback_url 自改
this.weibo.setupConsumerConfig(consumer_key, consumer_secret);
this.weibo.setRedirectUrl(callback_url);
weibo.authorize((Activity) this.context, new AuthDialogListener()); // 【备注1】

【备注1】:AuthDialogListener 继承 WeiboDialogListener 监听授权结果,包括 onComplete、 onError、onCancel、onWeiboException

显示一个授权窗口输入用户名密码

验证好了之后,其实他内部就已经帮你设置好了 AccessToken了,在 WeiBo 类为回收的时候,AccessToken 可以用来发微博等一系列操作

在有这样一段代码:

[java]
view plaincopy

public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET);
Weibo.getInstance().setAccessToken(accessToken);
Intent intent = new Intent();
intent.setClass(AuthorizeActivity.this, TestActivity.class);// 进入TestActivity
startActivity(intent);
}

TestActivity.java 的 OnClick 中就是发表的处理了(只发表文字),代码中可以看到 ShareActivity (com_weibo_android) 就是处理的类啦

[java]
view plaincopy

try {
Intent i = new Intent(TestActivity.this, ShareActivity.class);
TestActivity.this.startActivity(i);
} catch (WeiboException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

在 ShareActivity 中有一个 update 方法,这个就是发表文字和图片方法

[java]
view plaincopy

private String update(Weibo weibo, String source, String status,
String lon, String lat) throws MalformedURLException, IOException,
WeiboException {
WeiboParameters bundle = new WeiboParameters();
bundle.add("source", source);
bundle.add("status", status);
if (!TextUtils.isEmpty(lon)) {
bundle.add("lon", lon);
}
if (!TextUtils.isEmpty(lat)) {
bundle.add("lat", lat);
}
String rlt = "";
String url = Weibo.SERVER + "statuses/update.json";
AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo);
weiboRunner.request(this, url, bundle, Utility.HTTPMETHOD_POST, this);
return rlt;
}

下面是我 copy 改后代码:(精简后)

[java]
view plaincopy

/**
* 发表微博
*
* @param content
* 文字信息
*/
public void shareWeibo(String content) {
WeiboParameters bundle = new WeiboParameters();
bundle.add("source", Weibo.getAppKey());
bundle.add("status", content);
String url = Weibo.SERVER + "statuses/update.json";
AsyncWeiboRunner weiboRunner = new AsyncWeiboRunner(weibo);
weiboRunner.request(this.context, url, bundle, Utility.HTTPMETHOD_POST,
this);
}

基本上就ok了,我实现了发文字,不过还是有个问题。我想只登录,授权一次:

第一种方法:下面摘自Sina【备注2】


客户端的验证授权(Resource Owner Password Credentials)

基本流程

1.调用
https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=password&username=USER_NAME&password=PASSWORD


返回值 { "access_token":"Sl***32hkKG", "expires_in":3600 }

2. 使用获得的OAuth2.0 Access Token调用API

注:客户端的验证授权需要申请

【备注2】:不过无论怎么试,结果还是失败,不是Auth Fail,就是 400 Bad required,所以放弃

第二种方法:下面摘自Sina【备注3】


高级接口及特殊权限

(接口已接受线上申请)

1、OAuth认证时,要到授权网页获取授权码后才能获取AccessToken,请问是不是每次登录DIY客户端,都需要做这样一个认

证流程?
同一个的用户的话,可以直接存取对应的Accesstoken。直接调用接口即可。

【备注3】:亲手试了一下,用 SharePreferences,下面贴代码,在授期结果监听器中获取accessToken

[java]
view plaincopy

class AuthDialogListener implements WeiboDialogListener {
public void onComplete(Bundle values) {
String token = values.getString(SF_TOKEN);
String expires_in = values.getString(EXPIRES_IN);
AccessToken accessToken = new AccessToken(token, consumer_secret);
accessToken.setExpiresIn(expires_in);
Weibo.getInstance().setAccessToken(accessToken);
// 保存OAuth授权
SharedPreferences preferences = context.getSharedPreferences(
WEIBO_OAUTH, 0);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SF_TOKEN, token);
editor.putString(EXPIRES_IN, expires_in);
editor.commit();
// 通知授权成功
uihHandler.sendEmptyMessage(AUTHORIZE_FINISH);
}


public void onError(DialogError e) {
Toast.makeText(context, "网络连接错误 : " + e.getMessage(),
Toast.LENGTH_LONG).show();
}


public void onCancel() {
Toast.makeText(context, "授权取消", Toast.LENGTH_LONG).show();
}


public void onWeiboException(WeiboException e) {
Toast.makeText(context, "出现异常 : " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}

登录的时候做了一下判断:(就是 SharePreferences 读写)

[java]
view plaincopy

if(preferences.getString(SF_TOKEN, null) == null) {
this.weibo.setupConsumerConfig(this.consumer_key, this.consumer_secret);
this.weibo.setRedirectUrl(this.callback_url);
weibo.authorize((Activity) this.context, new AuthDialogListener());
} else {
this.weibo.setupConsumerConfig(this.consumer_key, this.consumer_secret);
this.weibo.setRedirectUrl(this.callback_url);
String token = preferences.getString(SF_TOKEN, null);
String expires_in = preferences.getString(EXPIRES_IN, null);
AccessToken accessToken = new AccessToken(token, consumer_secret);
accessToken.setExpiresIn(expires_in);
// 这一句很重要,因为会爆出WeiboException: auth faild! 21301 【备注4】
Utility.setAuthorization(new Oauth2AccessTokenHeader());
this.weibo.setAccessToken(accessToken);
Weibo.setSERVER("https://api.weibo.com/2/");
// 通知验证成功
uihHandler.sendEmptyMessage(AUTHORIZE_FINISH);
}

-------------------------------------------------------本文转自于网络,感谢原作者--------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: