新浪微博oauth认证实现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. 基本的流程是这样,设置密码,登陆等可自己替换。

时间: 2024-10-06 22:19:55

新浪微博oauth认证实现APP第三方登陆的相关文章

简单的新浪微博OAuth认证实现

System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY); System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET); Weibo weibo = new Weibo(); // set callback url, desktop app please set to null // http://ca

Android 中实现分享和第三方登陆---以新浪微博为例

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38781957 第三方登陆和分享功能在目前大部分APP中都有,分享功能可以将自己觉得有意义的东西分享给身边的朋友,而第三方登陆可以借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注册,直接使用第三方账号登陆,从而避免了注册的过程(其实是服务器端帮你注册),这对于吸引更多的用户非常有意义.下面我们就以新浪微博为例,讲解如何实现分享功能和第三方登陆.首先你

谈谈基于OAuth 2.0的第三方认证 [下篇]

从安全的角度来讲,<中篇> 介绍的Implicit类型的Authorization Grant存在这样的两个问题:其一,授权服务器没有对客户端应用进行认证,因为获取Access Token的请求只提供了客户端应用的ClientID而没有提供其ClientSecret:其二,Access Token是授权服务器单独颁发给客户端应用的,照理说对于其他人(包括拥有被访问资源的授权者)应该是不可见的.Authorization Code类型的Authorization Grant很好地解决了这两个问题

基于Thinkphp3.2的qq第三方oauth认证登录扩展类

基于Thinkphp3.2的qq第三方oauth认证登录扩展类,由于腾讯oauth sdk写的太多,不能与thinkphp和好的结合,最终想法讲腾讯oauth sdk写成tp的扩展类先看代码,将代码保存在/library/org/util/Qqconnect.class.php文件中在__construct方法中你可以直接写你的app_id.app_key和回调地址也可以根据自己的喜好,改一下代码传参或者写到配置文件.调用方法:1. 在qq的登录按钮的方法中调用getAuthCode方法例如:$

OAuth协议——PHP第三方登陆协议

慕课网Badguy老师的良心课程! 总会有那种什么都不想干的时候,但现在的日子又不这么允许个人的放纵,我一般就只有这几个选择:看课程视频,看书,看小说..好像还是有可以做的事情.其中,看课程视频有点无聊一般,而且还得老子动手写代码..找个好老师不错,嗯,最近跟着badguy学习吧~ 做做笔记 1.关于OAuth 全称Open Authorization,开放协议: 是一个PHP实现第三方登录的协议: 具体实现就简化为三大步骤: 但我个人是这么记录的: 2.登陆前 需要到“签订”该协议的网站进行申

新浪微博第三方登陆重定向错误23123

新浪微博第三方登陆重定向错误23123 2019年06月02日 13:49:43 温室花朵 阅读数:2更多 个人分类: 第三方微博登陆21323 编辑 当我们使用微博第三方登陆的时候,发现登陆出错了,错误码为:21323,解决方案如下: 首先找到settings,看下配置:WEIBO_APP_KEY = ‘1442285’WEIBO_APP_SECRET = '809af1f4e5e9b**f635d1b173e94a’ VUE的回调 回调给callback组件 WEIBO_FUNC_BACK

简单分析第三方登录之oauth认证

关键词:oauth.第三方登录 1.是什么? oauth认证就是一种授权认证机制. 简单分析:用户告诉系统,同意授权第三方应用(eg:本地服务器)进入系统(eg:qq/微信),获取这些数据,系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用,供第三方应用获取系统数据的一种授权认证机制. 2.为什么? 使用这个认证机制可以方便某些用户省去手动注册账号的麻烦,可以直接利用用户已有的信息来自动帮助用户进行注册,为用户带来便利. 3.怎么做? (1)基本流程: 请求用户授权:用

iOS 第三方登陆避免被APP STORE拒

iOS调用第三方登陆,如果用户没有安装第三方软件的时候,应该采取将第三方登陆按钮隐藏掉得办法实现. 微信:if ([WXApi isWXAppInstalled] && [WXApi isWXAppSupportApi]) QQ:[TencentOAuth iphoneQQInstalled] 如果强制跳转到安装下载页面有可能被拒!

网站添加第三方登陆(PHP版)

这两周正在写毕业设计,我做的是一个问答网站.先介绍一下这个网站:这是一个关于大学生在线问答的网站,类似知乎和百度知道,不过功能没有人家多,毕竟这个网站我一个人在做.网站部署在阿里云,网站包括API,Web,IOS,三大模块,现在没有找到人帮忙写安卓,唉...  网站API已经写完了,Web端正在完善开发中,毕业答辩之前会吧基本功能上线,小伙伴们可以访问看看增加人气,不过没有写完,并且看着不咋好看,因为没人写前端,我又不擅长写页面所以有点低端.域名是:http://www.olas.cn 上面说的