拿人人的OAuth认证举例吧。其实这个认证就是原则上实现了程序开发人员和用户的用户名密码的分离,使密码不会被第三方获取。
   只有被认证后,才能有权限调用人人网的接口方法。首先要去人人的开放平台去注册,各种信息都填好后,会给你一个API key和一个Secret key.
  首先,浏览器跳转到人人指定的授权服务页面,"https://graph.renren.com/oauth/authorize?client_id=XXX&response_type=code&redirect_uri=http://graph.renren.com/oauth/login_success.html";client_id就是你申请的API Key.。redirect_uri就是页面的跳转,这里使用人人给的默认页面

webview=(WebView)findViewById(R.id.webview);webview.getSettings().setJavaScriptEnabled(true);//不设置这个按钮不管用webview.getSettings().setBuiltInZoomControls(true);webview.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// TODO Auto-generated method stubview.loadUrl(url);return true;}//如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法:
shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数@Overridepublic void onReceivedSslError(WebView view,SslErrorHandler handler, SslError error) {// TODO Auto-generated method stubhandler.proceed();}@Overridepublic void onPageFinished(WebView view, String url) {
//当网页结束时回调该方法,这时服务器会向url尾部追加参数code,这个就是Authorization Code// TODO Auto-generated method stuburl1=webview.getUrl();if(url1!=null){//以下方法就是从url里截取codeString tString;if (url1.contains("code=")){tString = url1.substring(url1.indexOf("code=") + 5, url1.length());MyApplication.getInstance().code=tString;if(MyApplication.getInstance().code!=""){Intent intent=new Intent(AuthorizationActivity.this,WaitActivity.class);startActivity(intent);}}}super.onPageFinished(view, url);}});String url="https://graph.renren.com/oauth/authorize?client_id=0049faf6b6d045c1ssdd333a0f38e3c&response_type=code&redirect_uri=http://graph.renren.com/oauth/login_success.html";webview.loadUrl(url);

第二步就是获取Authorization Code了。
   需要发送请求(我用的POST)到“https://graph.renren.com/oauth/token”,并传递以下参数:
grant_type:固定值“authorization_code”。
code:上一步你获得的Authorization Code;
client_id:应用的API Key;
client_secret:应用的Secret Key;
redirect_uri:必须与获取Authorization Code时传递的“redirect_uri”保持一致。
发送完请求,服务器会返回给你一个JSON文件。自己解析,就会获得access_token,expires_in,refresh_token三个字符串,建议保存在SQLite或SharedPreference里,可以多次使用,貌似是两个月。
核心代码

url=new URL("https://graph.renren.com/oauth/token?");mHttpURLConnection=(HttpURLConnection) url.openConnection();mHttpURLConnection.setDoInput(true);//设置Input有效mHttpURLConnection.setDoOutput(true);String grant_type=     "grant_type=authorization_code";String code=           "&code="+MyApplication.getInstance().code;String client_id=      "&client_id=0049faf6b6d0s45c18dbed333a0f38e3c";String client_secret=  "&client_secret=d691227sfd46d474bab756de9815c677c";String redirect_uri=   "&redirect_uri=http://graph.renren.com/oauth/login_success.html";out=mHttpURLConnection.getOutputStream();out.write((grant_type+code+client_id+client_secret+redirect_uri).getBytes());out.flush();in=mHttpURLConnection.getInputStream();JsonParse parse=new JsonParse();Map<String,String> map=parse.TokenparseJson(in);//自己写的JSON文件解析的方法,我源代码里有MyApplication.getInstance().tokenMap=map;SharedPreferences preferences=getSharedPreferences("oauth", MODE_WORLD_WRITEABLE);//三个参数可复用,所以保存起来SharedPreferences.Editor editor=preferences.edit();editor.putString("access_token", map.get("access_token"));editor.putString("expires_in", map.get("expires_in"));editor.putString("refresh_token", map.get("refresh_token"));editor.commit();

接下来就是要得到Session Key,其实这步可以省略,貌似以前只有获得了Session Key才能调用接口的方法,但是现在直接用access_token就可以了,不过还是讲讲怎么获取吧。
    POST请求到https://graph.renren.com/renren_api/session_key,写入参数oauth_token=your access_token
    核心代码:

url = new URL("https://graph.renren.com/renren_api/session_key");HttpURLConnection mHttpURLConnection=(HttpURLConnection)url.openConnection();mHttpURLConnection.setDoInput(true);mHttpURLConnection.setDoOutput(true);String pramar="oauth_token="+MyApplication.getInstance().tokenMap.get("access_token");OutputStream out=mHttpURLConnection.getOutputStream();out.write(pramar.getBytes());out.flush();InputStream in=mHttpURLConnection.getInputStream();byte[] byt=new byte[1024];//不知道为什么,使用BuffedReader循环读取总是有问题,曲线救国了int a=in.read(byt);//调试的时候可以看看那个JSON是什么样子的,在自己写个解析方法String tempString=new String(byt, 0, a, "UTF-8");String jsonString="["+tempString+"]";JSONArray jsonArray=new JSONArray(jsonString);JSONObject object=jsonArray.getJSONObject(0);JSONObject renren_token=object.getJSONObject("renren_token");session_key=renren_token.getString("session_key");MyApplication.getInstance().session_key=session_key;

该获得的都得到了,该调用API了,但是在这之前还有一项最重要的工作-——签名,据人人网称,这是为了防止你的Sercret key被盗用。以users.getLoggedInUser这个API为例

String v1="1.0";String api_key1="0049faf6b6d045c18dbqed333a0f38e3c";String format1="JSON";//要把人人网每个API规定的必须参数按照字典升序排列,之后追加Sercret Key在末尾,经过MD5算法,得到的字符串就是你的签名了String session_key1=MyApplication.getInstance().session_key;public String getLoggedInUser(){GetSignatureM mGetSignatureM=new GetSignatureM();List<String> paramList=new ArrayList<String>();paramList.add("v="+v1);paramList.add("api_key="+api_key1);paramList.add("format="+format1);paramList.add("session_key="+session_key1);paramList.add("method=users.getLoggedInUser");String sig1=mGetSignatureM.getSignature(paramList, "d691227fds46d474bab756de9815c677c");try {String method=URLEncoder.encode("users.getLoggedInUser","UTF-8");String session_key=URLEncoder.encode(session_key1,"UTF-8");String api_key=URLEncoder.encode(api_key1,"UTF-8");String format=URLEncoder.encode(format1,"UTF-8");String v=URLEncoder.encode(v1,"UTF-8");String sig=URLEncoder.encode(sig1,"UTF-8");HttpPost mHttpPost=new HttpPost();String url="http://api.renren.com/restserver.do";String parmar="method="+method+"&session_key="+session_key+"&api_key="+api_key+"&format="+format+"&v="+v+"&sig="+sig;InputStream in=mHttpPost.doPost(url, parmar);byte[] b=new byte[1024];int a=in.read(b);String line="["+new String(b, 0, a,"UTF-8")+"]";return line;

MD5算法

Collections.sort(paramList);StringBuffer buffer = new StringBuffer();for (String param : paramList) {buffer.append(param);  //将参数键值对,以字典序升序排列后,拼接在一起}buffer.append(secret);  //符串末尾追加上应用的Secret Keytry {            //下面是将拼好的字符串转成MD5值,然后返回java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");StringBuffer result = new StringBuffer();try {for (byte b : md.digest(buffer.toString().getBytes("UTF-8"))) {result.append(Integer.toHexString((b & 0xf0) >>> 4));result.append(Integer.toHexString(b & 0x0f));}} catch (UnsupportedEncodingException e) {for (byte b : md.digest(buffer.toString().getBytes())) {result.append(Integer.toHexString((b & 0xf0) >>> 4));result.append(Integer.toHexString(b & 0x0f));}}return result.toString();

这样就能调用API了

转自http://eoeandroid.com/thread-114876-1-1.html

转载于:https://www.cnblogs.com/neilyo/archive/2011/11/15/2249243.html

OAuth认证(完整版)相关推荐

  1. MongoDB分片+副本+keyFile认证(新手部署完整版)

    MongoDB分片+副本+keyFile认证(新手部署完整版) 部署详情 服务器yhcs_1 IP:192.168.43.211 服务器yhcs_2 IP:192.168.43.212 服务器yhcs ...

  2. 华为ipd产品开发流程_亲历华为IPD变革是怎样一种体验|附完整版培训教材

    华为作为国内率先推行IPD并取得巨大成功的企业,一直以来都被业界所推崇.许多公司也效仿华为实施了IPD体系变革,以期推动企业的快速发展.华为是怎么推行IPD的?在华为亲身经历IPD变革是怎样一种体验? ...

  3. 官宣!张小龙史上最长演讲 4小时3万字完整版回应微信的一切

    戳蓝字"CSDN云计算"关注我们哦! 文章来自:腾讯科技(ID:qqtech) 腾讯科技讯 1月9日消息,在今日举行的2019微信公开课PRO的微信之夜上,腾讯公司高级执行副总裁. ...

  4. android 除了webview 浏览器控件,android开发我的新浪微博客户端-OAuth认证过程中用WebView代替原来的系统自带浏览器...

    前面的文章的OAuth认证过程在获取oauth_verifier码是是通过调用android系统带的浏览器进行用户授权认证的, 具体见:android开发我的新浪微博客户端-用户授权页面功能篇(3.2 ...

  5. Discuz3.数据库数据表字典详解(完整版)

    Discuz3.数据库数据表字典详解(完整版) 转自:https://discuzt.cr180.com/discuzcode-db.html pre_common_admincp_cmenu后台菜单 ...

  6. Linux环境下搭建Apache服务器(完整版)

    Linux下搭建Apache服务器(完整版) 什么是Apache? Apache Licence是著名的非盈利开源组织Apache采用的协议.该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权, ...

  7. 终于有华为高工整理网工基础知识完整版,看完就入门

    前言 网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员.根据招聘网站最新一年数据统计,网络工程师月平均工资可以达到12.3K,而2021年较2020年增长了18%. 网络工程 ...

  8. 开源网店程序magento目录结构完整版

    magento目录结构完整版 以下是magento目录结构完整版:另有magento的文件结构图与原理简述 /app – 程序根目录 /app/etc – 全局配置文件目录 /app/code – 所 ...

  9. nginx-http-flv-module使用鉴权完整版

    nginx-http-flv-module使用鉴权完整版 nginx-http-flv-module基于nginx实现的FLV直播模块.本文介绍怎么使用该模块进行直播和鉴权. 简要说明:直播模块分为两 ...

最新文章

  1. npm install遇到ENOENT: no such file or directory, rename错误
  2. arm remapping控制输入_人形机器人实时控制系统解密,机器人足球队战胜人类不是梦?...
  3. sql远程mysql服务器查询_sql server 使用链接服务器远程查询
  4. 播放RTMP协议的流媒体的几种选择
  5. 灵魂拷问!细数Android开发者的艰辛历程,成功入职阿里
  6. P1002 [NOIP2002 普及组] 过河卒(python3实现)
  7. openstack mitaka 完整安装详细文档(亲测,花了3天时间)
  8. python经典实例-终于明了python入门经典实例
  9. 螃蟹学PHP设计模式之访问者模式
  10. 零起点学习Linux系列培训视频 [共61课] (万分感谢寒冰老师分享!)
  11. LitePal数据存储
  12. mac 修改hosts的2种方案
  13. 刀具寿命预测研究方法
  14. 会话技术——Cookie
  15. 两码一号(九):业务监控
  16. Java学习总结3——枚举类和反射机制
  17. 西班牙语dele等级_DELE——西班牙语水平考试
  18. Android开发应用案例——简易计算器(附完整源码)
  19. 嵌入式硬件工程师应具备哪些基本技能?
  20. CES展会的技术亮点奠定2017年各个行业的基调

热门文章

  1. html图片的宽度和高度设置,CSS设置img图片的宽度和高度
  2. HDU 6082 度度熊与邪恶大魔王 (完全背包)
  3. 【三维路径规划】基于RRT实现三维路径规划matlab源码
  4. 解决margin塌陷问题
  5. Linux虚拟机与主机共享文档
  6. 甲骨文公司 Oracle
  7. JAVA语言程序设计教程张席_Java语言程序设计教程
  8. 综合布线测试仪的测试方法与标准
  9. 启用Direct3D功能
  10. 【苹果电脑数据恢复】mac超强数据恢复软件免费下载