Android Oauth2.0认证的简单使用

1:从SNS网站获取API接口,比如开心网,就可以获取一个导航到我们应用的AuthUrl,比如:
http://api.kaixin001.com/oauth2/authorize?response_type=token&client_id=369401352080e667677a3b045e3ca0b4&redirect_uri=http://aile.com&scope=basic user_birthday user_marriage user_intro user_repaste user_records user_photo user_diary user_messagebox user_rgroup user_online user_comment user_forward user_feed friends_birthday friends_marriage friends_intro friends_diary friends_online friends_feed create_records&display=popup&client=1

2:通过webview组件加载该AuthUrl导航登录页面,然后创建WebViewClient,通过onPageStarted捕捉页面加载情况,只要输入正确的登录信息就会
跳转,所以新的Url包含我们所需要的信息,比如accessToken,refreshToken,expires,userId这些重要信息

        //webview相关设置
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setSupportZoom(true);
        settings.setBuiltInZoomControls(true);
        settings.setSavePassword(false);
        settings.setSaveFormData(false);
        checkWebViewUrl(webView, authUrl);
        webView.requestFocusFromTouch();
        WebViewClient wvc = new WebViewClient() {
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                if (oneAuth) {
                    layout.setVisibility(0);
                    oneAuth = false;
                }
                String reUrl = url;
                if (reUrl.startsWith("http://aile.com")) {
                    webView.stopLoading();
                    if (reUrl.indexOf("access_token") != -1) {
                        // 截取url中的accessToken
                        int startPos = reUrl.indexOf("token=") + 6;
                        int endPos = reUrl.indexOf("&expires_in");
                        accessToken = reUrl.substring(startPos, endPos);
                        // 截取url中的refreshToken 
                        int startRef = reUrl.indexOf("refresh_token=") + 14;
                        int endRef = reUrl.indexOf("&encodeuid");
                        refreshToken = reUrl.substring(startRef, endRef);
                        // 截取url中的expires 
                        int startExp = reUrl.indexOf("expires_in=") + 11;
                        int endExp = reUrl.indexOf("&scope");
                        expires = reUrl.substring(startExp, endExp);
                        // 截取url中的userId 
                        int endPosID = accessToken.indexOf("_");
                        userId = accessToken.substring(0, endPosID);
                        showPopuBar("正在绑定");
                        //调用线程
                        Oauth();
                    }
                }
            }
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                layout.setVisibility(8);
            }
        };
        webView.setWebViewClient(wvc);

3:开启工作线程将这些重要信息保存到服务器,而后在UI线程做相关操作,Oauth()方法中处理:

        intent = null;
        //UI线程,负责处理工作线程发送的消息,完成Oauth授权认证
        Handler kaixinhandler = new Handler() {
            public void handleMessage(Message msg) {
            .....
            };
        //将数据保存到HashMap中
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("token", accessToken);
        params.put("userId", userId);
        params.put("siteId", siteId);
        params.put("openId", "");
        params.put("expires", expires);
        params.put("refreshToken", refreshToken);
        //启动工作线程完成绑定检查,用户检查,注册,登录,获取用户信息等等,并发送消息给UI线程处理
        snsThread = new AuthThread(this, kaixinhandler, params, spRenRen, sp,
                type, siteId, identity);
        snsThread.start();

好了,这就是Oauth2.0的工作原理

猜你喜欢

转载自blog.csdn.net/ware00/article/details/70768971