300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 实现新浪微博授权一次多次登录的功能

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

时间:2022-06-16 05:58:07

相关推荐

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

目录(?)[-]

实现新浪微博授权一次多次登录的功能 原文有删改原文地址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新增了有效期,更多 资料:/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 plain copy //consumer_key,consumer_secret,callback_url自改this.weibo.setupConsumerConfig(consumer_key,consumer_secret);this.weibo.setRedirectUrl(callback_url);weibo.authorize((Activity)this.context,newAuthDialogListener());//【备注1】

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

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

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

在有这样一段代码:

[java]view plain copy publicvoidonComplete(Bundlevalues){Stringtoken=values.getString("access_token");Stringexpires_in=values.getString("expires_in");AccessTokenaccessToken=newAccessToken(token,CONSUMER_SECRET);Weibo.getInstance().setAccessToken(accessToken);Intentintent=newIntent();intent.setClass(AuthorizeActivity.this,TestActivity.class);//进入TestActivitystartActivity(intent);}

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

[java]view plain copy try{Intenti=newIntent(TestActivity.this,ShareActivity.class);TestActivity.this.startActivity(i);}catch(WeiboExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}

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

[java]view plain copy privateStringupdate(Weiboweibo,Stringsource,Stringstatus,Stringlon,Stringlat)throwsMalformedURLException,IOException,WeiboException{WeiboParametersbundle=newWeiboParameters();bundle.add("source",source);bundle.add("status",status);if(!TextUtils.isEmpty(lon)){bundle.add("lon",lon);}if(!TextUtils.isEmpty(lat)){bundle.add("lat",lat);}Stringrlt="";Stringurl=Weibo.SERVER+"statuses/update.json";AsyncWeiboRunnerweiboRunner=newAsyncWeiboRunner(weibo);weiboRunner.request(this,url,bundle,Utility.HTTPMETHOD_POST,this);returnrlt;} 下面是我 copy 改后代码:(精简后)[java]view plain copy /***发表微博**@paramcontent*文字信息*/publicvoidshareWeibo(Stringcontent){WeiboParametersbundle=newWeiboParameters();bundle.add("source",Weibo.getAppKey());bundle.add("status",content);Stringurl=Weibo.SERVER+"statuses/update.json";AsyncWeiboRunnerweiboRunner=newAsyncWeiboRunner(weibo);weiboRunner.request(this.context,url,bundle,Utility.HTTPMETHOD_POST,this);}

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

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

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

基本流程

1.调用

/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=password&username=USER_NAME&password=PASSWORD

返回值 { "access_token":"SlAV32hkKG", "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 plain copy classAuthDialogListenerimplementsWeiboDialogListener{publicvoidonComplete(Bundlevalues){Stringtoken=values.getString(SF_TOKEN);Stringexpires_in=values.getString(EXPIRES_IN);AccessTokenaccessToken=newAccessToken(token,consumer_secret);accessToken.setExpiresIn(expires_in);Weibo.getInstance().setAccessToken(accessToken);//保存OAuth授权SharedPreferencespreferences=context.getSharedPreferences(WEIBO_OAUTH,0);SharedPreferences.Editoreditor=preferences.edit();editor.putString(SF_TOKEN,token);editor.putString(EXPIRES_IN,expires_in);mit();//通知授权成功uihHandler.sendEmptyMessage(AUTHORIZE_FINISH);}publicvoidonError(DialogErrore){Toast.makeText(context,"网络连接错误:"+e.getMessage(),Toast.LENGTH_LONG).show();}publicvoidonCancel(){Toast.makeText(context,"授权取消",Toast.LENGTH_LONG).show();}publicvoidonWeiboException(WeiboExceptione){Toast.makeText(context,"出现异常:"+e.getMessage(),Toast.LENGTH_LONG).show();}}

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

[java]view plain copy 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,newAuthDialogListener());}else{this.weibo.setupConsumerConfig(this.consumer_key,this.consumer_secret);this.weibo.setRedirectUrl(this.callback_url);Stringtoken=preferences.getString(SF_TOKEN,null);Stringexpires_in=preferences.getString(EXPIRES_IN,null);AccessTokenaccessToken=newAccessToken(token,consumer_secret);accessToken.setExpiresIn(expires_in);//这一句很重要,因为会爆出WeiboException:authfaild!21301【备注4】Utility.setAuthorization(newOauth2AccessTokenHeader());this.weibo.setAccessToken(accessToken);Weibo.setSERVER("/2/");//通知验证成功uihHandler.sendEmptyMessage(AUTHORIZE_FINISH);}

-------------------------------------------------------本文转自于网络,感谢原作者--------------------------------------------------------------------

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。