博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android开发我的新浪微博客户端-OAuth篇(2.1)
阅读量:4104 次
发布时间:2019-05-25

本文共 5192 字,大约阅读时间需要 17 分钟。

 

本篇说说关于OAuth授权认证的事情,新浪开放api都必须在这个基础上才能调用,所以有必要专门来讲讲,前面的文章中已经提到过关于新浪微博提供了OAuth和Base OAuth两种认证方式,并且本项目采用OAuth认证方式,至于为什么采用这个OAuth认证而不采用Base OAuth认证原因很简单,自从Twitter只支持OAuth认证方式以来,各大应用都纷纷转向OAuth认证方式,而新浪微博的开放平台也将在近日停止Base OAuth的认证方式。

     OAuth的基本概念,OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。同样新浪微博提供OAuth认证也是为了保证用户账号和密码的安全,在这里通过OAuth建立普通新浪微博用户、客户端程序(我们正在开发的这个android客户端程序)、新浪微博三者之间的相互信任关系,让客户端程序(我们正在开发的这个android客户端程序)不需要知道用户的账号和密码也能浏览、发布微博,这样有效的保护了用户账号的安全性不需要把账号密码透露给客户端程序又达到了通过客户端程序写微博看微博目的。这个是OAuth的作用。

      结合新浪微博的OAuth认证来说说具体的功能实现,首先罗列一下关键字组,下面四组关键字跟我们接下来OAuth认证有非常大的关系。

      第一组:(App Key和App Secret),这组参数就是本系列文本第一篇提到的建一个新的应用获取App Key和App Secret。

      第二组:(Request Token和Request Secret)

      第三组:(oauth_verifier

      第四组:(user_id、Access Token和Access Secret) 

     新浪微博的OAuth认证过程,当用户第一次使用本客户端软件时,客户端程序用第一组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软件同时表示新浪微博信任本客户端软件,当客户端软件获取第二组参数时作为参数引导用户浏览器跳至,然后用户在新浪的这个授权页面里输入自己的微博账号和密码进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件并表示用户也信任本客户端软件,接下客户端软件把第二组参数和第三组参数作为参数再次向新浪微博发起请求,然后新浪微博返回第四组参数给客户端软件,第四组参数需要好好的保存起来这个就是用来代替用户的新浪账号和密码用的,在后面调用api时都需要。从这个过程来看用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户和密码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了账户和密码透露给新浪微博之外的第三方应用程序,保证 了安全性。

      本项目用为了方便开发采用了进行OAuth认证开发,新建OAuth.java类文件对OA进行简单的封装,OAuth类主要有RequestAccessToken、GetAccessToken、SignRequest三个方法,第一个方法RequestAccessToken就是上面过程中用来获取第三组参数用的,GetAccessToken方法是用来获取第四组参数用,SignRequest方法是用来调用api用。由于采用了简单了很多。具体代码如下:

public class OAuth {    private CommonsHttpOAuthConsumer httpOauthConsumer;    private OAuthProvider httpOauthprovider;    public String consumerKey;    public String consumerSecret;        public OAuth()    {            // 第一组:(App Key和App Secret)        // 这组参数就是本系列文本第一篇提到的建一个新的应用获取App Key和App Secret。        this("3315495489","e2731e7grf592c0fd7fea32406f86e1b");    }    public OAuth(String consumerKey,String consumerSecret)    {        this.consumerKey=consumerKey;        this.consumerSecret=consumerSecret;    }        public Boolean RequestAccessToken(Activity activity,String callBackUrl){        Boolean ret=false;        try{            httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey,consumerSecret);            httpOauthprovider = new DefaultOAuthProvider("http://api.t.sina.com.cn/oauth/request_token","http://api.t.sina.com.cn/oauth/access_token","http://api.t.sina.com.cn/oauth/authorize");            String authUrl = httpOauthprovider.retrieveRequestToken(httpOauthConsumer, callBackUrl);            activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));            ret=true;        }catch(Exception e){        }        return ret;    }        public UserInfo GetAccessToken(Intent intent){        UserInfo user=null;        Uri uri = intent.getData();        String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);        try {            httpOauthprovider.setOAuth10a(true);             httpOauthprovider.retrieveAccessToken(httpOauthConsumer,verifier);        } catch (OAuthMessageSignerException ex) {            ex.printStackTrace();        } catch (OAuthNotAuthorizedException ex) {            ex.printStackTrace();        } catch (OAuthExpectationFailedException ex) {            ex.printStackTrace();        } catch (OAuthCommunicationException ex) {            ex.printStackTrace();        }        SortedSet
user_id= httpOauthprovider.getResponseParameters().get("user_id"); String userId=user_id.first(); String userKey = httpOauthConsumer.getToken(); String userSecret = httpOauthConsumer.getTokenSecret(); user=new UserInfo(); user.setUserId(userId); user.setToken(userKey); user.setTokenSecret(userSecret); return user; } public HttpResponse SignRequest(String token,String tokenSecret,String url,List params) { HttpPost post = new HttpPost(url); //HttpClient httpClient = null; try{ post.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //关闭Expect:100-Continue握手 //100-Continue握手需谨慎使用,因为遇到不支持HTTP/1.1协议的服务器或者代理时会引起问题 post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); return SignRequest(token,tokenSecret,post); } public HttpResponse SignRequest(String token,String tokenSecret,HttpPost post){ httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey,consumerSecret); httpOauthConsumer.setTokenWithSecret(token,tokenSecret); HttpResponse response = null; try { httpOauthConsumer.sign(post); } catch (OAuthMessageSignerException e) { e.printStackTrace(); } catch (OAuthExpectationFailedException e) { e.printStackTrace(); } catch (OAuthCommunicationException e) { e.printStackTrace(); } //取得HTTP response try { response = new DefaultHttpClient().execute(post); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return response; }}

转载地址:http://iodsi.baihongyu.com/

你可能感兴趣的文章
Python 趣味打怪:147 段简单代码助你从入门到大师
查看>>
卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!
查看>>
厉害了!Python 编辑器界的神器 Jupyter ,推出官方可视化 Debug 工具!
查看>>
卧槽!Java 虚拟机竟然还有这些性能调优技巧...
查看>>
听说玩这些游戏能提升编程能力?
查看>>
7 年工作经验,面试官竟然还让我写算法题???
查看>>
被 Zoom 逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
查看>>
再见,Eclipse...
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
漫话:为什么你下载小电影的时候进度总是卡在 99% 就不动了?
查看>>
我去!原来大神都是这样玩转「多线程与高并发」的...
查看>>
当你无聊时,可以玩玩 GitHub 上这个开源项目...
查看>>
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>
安利 10 个让你爽到爆的 IDEA 必备插件!
查看>>
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
Java各种集合类的合并(数组、List、Set、Map)
查看>>
JS中各种数组遍历方式的性能对比
查看>>