热门标签 | 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第三方登陆


推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
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社区 版权所有