热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新浪微博oauth认证实现APP第三方登陆

最近在做一个图片分享的APP,为增加用户入口,便于注册,先采用新浪微博作为第三方的入口。我采用的注册流程如下:微博的开发者管理平台登录注册过程在这里就不提了,各位看官请自行百度。介

最近在做一个图片分享的APP,为增加用户入口,便于注册,先采用新浪微博作为第三方的入口。 我采用的注册流程如下:

 技术分享

  • 微博的开发者管理平台登录注册过程在这里就不提了,各位看官请自行百度。
  • 介绍WebView的方式进行认证注册

  1. 考虑到日后可能添加其他第三方入口,在登陆页面添加如下内容:
1         btnWeibo.setOnClickListener(new View.OnClickListener() {
2 
3             @Override
4             public void onClick(View v) {
5                 Intent intent = new Intent(LoginActivity.this,
6                         SinaOAuthActivity.class);
7                 startActivity(intent);
8             }
9         });

     2. 载入认证页面,使用到的微博提供的url功能接口如下

 1     public static String SINA_CONSUMER_KEY = "APP KEY";
 2     public static String SINA_CONSUMER_SECRET = "APP SECRET";
 3     public static String ACCESS_TOKEN = "";
 4     public static String UID ="";
 5     public static String PREFERENCES_NAME = "PACKET NAME";  //可在AndroidManifest.xml中查看
 6     //认证页面url
 7     public static String SINA_OAUTH = "https://api.weibo.com/oauth2/authorize?client_id="
 8             + SINA_CONSUMER_KEY
 9             + "&response_type=code&redirect_uri=http://www.sina.com"
10             + "&display=mobile";
11   //获取ACCESS TOKEN
12     public static String SINA_ACCESS_TOKEN = "https://api.weibo.com/oauth2/access_token?client_id="
13             + SINA_CONSUMER_KEY
14             + "&client_secret="
15             + SINA_CONSUMER_SECRET
16             + "&grant_type=authorization_code&redirect_uri=http://www.sina.com&code=";
17     //根据UID获取用户详细信息
18     private static String SINA_DETAIL_INFORMATION = "https://api.weibo.com/2/users/show.json?source="
19             + SINA_CONSUMER_KEY
20             + "&access_token="
21             + ACCESS_TOKEN
22             + "&uid="+UID;

  3.  认证Activity代码如下, 登陆并获取用户信息后,与客户端进行通信,验证该用户(微博用户)是否已在本服务器注册,若已注册,直接登陆;若未注册,跳转至设置密码页面。之后在本地添加用户登录信息,即可免填写用户名密码直接登录。

  1 public class SinaOAuthMainActivity extends Activity {
  2     public WebView webview;
  3     String code = "";
  4     String result ="";
  5     Intent intent;
  6     public WeiboUser user = new WeiboUser();
  7     public SPreferenceInf spi = new SPreferenceInf();
  8     public static final String WEIBO_USER = "com.cse.myperson.WEIBO_USER";
  9     @Override
 10     protected void onCreate(Bundle savedInstanceState) {
 11         super.onCreate(savedInstanceState);
 12         setContentView(R.layout.sina_oauth_webview);
 13         webview = (WebView) this.findViewById(R.id.oauth_webview);
 14         webview.getSettings().setJavascriptEnabled(true);
 15         webview.setFocusable(true);
 16         webview.loadUrl(WeiboConstant.SINA_OAUTH);
 17 
 18         webview.setWebViewClient(new WebViewClient() {
 19             @Override
 20             public void onPageFinished(WebView view, String url) {
 21                 new Thread(runnable).start();
 22                 Log.i("onPageFinished", url + "网页加载完毕");
 23                 super.onPageFinished(view, url);
 24             }
 25 
 26             @Override
 27             public boolean shouldOverrideUrlLoading(WebView view, String url) {
 28                 Log.i("shouldOverrideUrlLoading", url);
 29                 webview.loadUrl(url);
 30                 return super.shouldOverrideUrlLoading(view, url);
 31             }
 32             
 33             // 加载页面
 34             @Override
 35             public void onPageStarted(WebView view, String url, Bitmap favicon) {
 36                 Log.e("onPageStarted", url + "开始加载界面");
 37                 if (url.startsWith("http://www.sina.com")) {
 38                     // 取消授权后的界面
 39                     view.cancelLongPress();
 40                     view.stopLoading();
 41 
 42                     // 获取Code
 43                     Uri uri = Uri.parse(url);
 44                     code = uri.getQueryParameter("code");
 45                     Log.e("code", WeiboConstant.SINA_ACCESS_TOKEN + code);
 46                     
 47                     try {
 48                         Thread.sleep(1000);
 49                     } catch (InterruptedException e) {
 50                         // TODO Auto-generated catch block
 51                         e.printStackTrace();
 52                     }
 53                     if (result.startsWith("{\"access_token\":")) {
 54                         int i = result.indexOf(":");
 55                         int j = result.indexOf(",");
 56                         WeiboConstant.ACCESS_TOKEN = result.substring(i + 2,
 57                                 j - 1);
 58                         int uidIndex = result.indexOf("uid");
 59                         int endIndex = result.length();
 60                         WeiboConstant.UID = result.substring(uidIndex+6,endIndex-2);
 61                         
 62                         Log.e("ACCESS_TOKEN", WeiboConstant.ACCESS_TOKEN);
 63                         Log.e("UID", WeiboConstant.UID);
 64                         new Thread(runnable_USER).start();
 65                         finish();
 66                     }
 67                 }
 68                 super.onPageStarted(view, url, favicon);
 69             }
 70         });
 71     }
 72     
 73     //登陆请求
 74     Runnable runnable = new Runnable(){
 75 
 76         @Override
 77         public void run() {
 78             // TODO Auto-generated method stub
 79             if (code != null) {
 80                 result = HttpsUtil.HttpsPost(
 81                         WeiboConstant.SINA_ACCESS_TOKEN + code, "");
 82                 Log.e("Https地址", WeiboConstant.SINA_ACCESS_TOKEN + code);
 83                 Log.e("登录请求结果", result);
 84             }
 85         }
 86         
 87     };
 88     
 89 
 90     //获取个人信息请求
 91     Runnable runnable_USER = new Runnable(){
 92 
 93         @Override
 94         public void run() {
 95             String url = StaticValue.url+"/register";
 96             
 97             if (code != null ) {
 98                 result = HttpsUtil.httpPost(
 99                         WeiboConstant.freshSinaInf(), "");
100                     if(!result.startsWith("{\"error\":")){
101                     user.adapter(result);
102                     user.showAll();
103                     
104                 }
105                 Log.e("请求用户信息Https地址", WeiboConstant.freshSinaInf());
106                 Log.e("用户详细信息", result);
107             }
108             String result = CheckRegister.checkRegisterRequest(url, user.getLoginname());
109             String[] params;
110             params = result.split(";");
111             if(params[0].equals("existed")){
112                 SharedPerferenceUtil.writeSP(SinaOAuthActivity.this, 
113                         user.getLoginname(), params[1]);
114                 intent = new Intent(SinaOAuthActivity.this,
115                         LoginActivity.class);
116                 startActivity(intent);
117                 finish();
118             }else if(params[0].equals("inexist")){
119                 toSetPass();
120                 Toast.makeText(SinaOAuthActivity.this, "认证成功",
121                         Toast.LENGTH_LONG).show();
122             }
123             
124         }
125         
126     };
127 
128     /**
129      * 跳转至密码设置页面
130      */
131     public void toSetPass(){
132         Log.e("from success!!!!!","loginname is "+user.getLoginname()
133                 +"username is "+user.getUsername());
134         intent = new Intent(SinaOAuthActivity.this,
135                 SetPasswordActivity.class);
136         Bundle mBundle = new Bundle();  
137         mBundle.putSerializable(WEIBO_USER, user);  
138         intent.setAction(WEIBO_USER);
139         intent.putExtras(mBundle);        
140         startActivity(intent);
141     }
142 
143 }

  4. 这里有一个地方需注意,当采用WebView微博登陆后,每次登陆都会在本地保存COOKIEs登陆信息。这也是我在开发中遇到的一个难题,一个用户注册成功后,再次进入,直接提示认证成功。一开始认为是用SharedPreferences将登陆信息保存为xml文件了,但在/data相关路径下没有找到。之后转念一想,会不会存在数据库里了,最后在/databases路径下找到了webviewCOOKIEsChromium.db这个文件,在COOKIEs表中,看到了登陆信息。 认证成功后,调用这个方法即可:

1   public static  void removeCOOKIE(Context context) {
2             COOKIESyncManager.createInstance(context);  
3             COOKIEManager COOKIEManager = COOKIEManager.getInstance(); 
4             COOKIEManager.removeAllCOOKIE();
5             COOKIESyncManager.getInstance().sync();
6       }

     也许我采用了一种比较笨的方法,把COOKIE的表都清空了,各位看客有好方法的话,请赐教哈。

   5. 基本的流程是这样,设置密码,登陆等可自己替换。

 

新浪微博oauth认证实现APP第三方登陆


推荐阅读
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 经过一年的思考,我发现自己对开发的兴趣并不浓厚,而对算法研究则更加热衷。本文将探讨开发与算法之间的本质差异,并分享我的未来学习计划。 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • Bootstrap 缩略图展示示例
    本文将展示如何使用 Bootstrap 实现缩略图效果,并提供详细的代码示例。 ... [详细]
  • 本文介绍了一种支付平台异步风控系统的架构模型,旨在为开发类似系统的工程师提供参考。 ... [详细]
  • 使用 Git Rebase -i 合并多个提交
    在开发过程中,频繁的小改动往往会生成多个提交记录。为了保持代码仓库的整洁,我们可以使用 git rebase -i 命令将多个提交合并成一个。 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • MySQL 数据库连接方法
    本文介绍了如何使用 MySQL 命令行工具连接到指定的数据库。 ... [详细]
  • 自动验证时页面显示问题的解决方法
    在使用自动验证功能时,页面未能正确显示错误信息。通过使用 `dump($info->getError())` 可以帮助诊断和解决问题。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 数字资产量化交易通过大数据分析,以客观的方式制定交易决策,有效减少人为的主观判断和情绪影响。本文介绍了几种常见的数字资产量化交易策略,包括搬砖套利和趋势交易,并探讨了量化交易软件的开发前景。 ... [详细]
  • 自定义滚动条美化页面内容
    当页面内容超出显示范围时,为了提升用户体验和页面美观,通常会添加滚动条。如果默认的浏览器滚动条无法满足设计需求,我们可以自定义一个符合要求的滚动条。本文将详细介绍自定义滚动条的实现过程。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
author-avatar
鱼鱼de眼泪2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有