九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
web實(shí)現(xiàn)QQ第三方登錄

應(yīng)用場(chǎng)景

    web應(yīng)用通過(guò)QQ登錄授權(quán)實(shí)現(xiàn)第三方登錄。

操作步驟

    1  注冊(cè)成為QQ互聯(lián)平臺(tái)開(kāi)發(fā)者,http://connect.qq.com/
    2  準(zhǔn)備一個(gè)可訪問(wèn)的域名,如dev.foo.com
    3  創(chuàng)建網(wǎng)頁(yè)應(yīng)用,配置必要信息,其中包括域名以及回調(diào)地址;
        其中域名需要驗(yàn)證,需確保對(duì)域名主機(jī)有足夠的控制權(quán)限
    4  獲取應(yīng)用appID、appKey進(jìn)行開(kāi)發(fā)

登錄流程

    開(kāi)發(fā)平臺(tái)的登錄授權(quán)采取oauth2.0機(jī)制,這也是目前幾乎所有互聯(lián)網(wǎng)開(kāi)放平臺(tái)所采取的方式。
    
    需更多了解oauth2.0可參考阮老師的文章: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

實(shí)現(xiàn)方式

    client-side
        流程:
        前端頁(yè)面通過(guò)Implict方式 登錄授權(quán) -> 回調(diào)獲得accessToken -> 獲取openid -> 同步用戶信息并登錄
        為了保證數(shù)據(jù)安全,在獲取用戶信息并登錄這一步必須由服務(wù)端實(shí)現(xiàn)。
        這種方式的開(kāi)發(fā)相對(duì)便捷,也是后面的實(shí)戰(zhàn)案例將要采取的方式。
    server-side
        流程:
        由server端頁(yè)面跳轉(zhuǎn)到登錄授權(quán)頁(yè)面(Authorization code方式) -> 回調(diào)獲得code -> 置換accessToken -> 獲取openid -> 同步用戶信息并登錄

SDK使用

    JSSDK  可快捷實(shí)現(xiàn)前端登錄授權(quán)的功能,可自定制登錄按鈕
        缺點(diǎn):存在瀏覽器兼容風(fēng)險(xiǎn),此外登錄按鈕UI的定制也存在受限
    JavaSDK  屏蔽了oauth授權(quán)的復(fù)雜度,方便后端實(shí)現(xiàn)授權(quán)及api操作
        缺點(diǎn):增加依賴jar包,項(xiàng)目容易變得臃腫,尤其是當(dāng)前項(xiàng)目已經(jīng)存在oauth功能實(shí)現(xiàn)時(shí)可不必采用。

案例實(shí)戰(zhàn)

    功能描述
    clientside + server-side 通過(guò)QQ網(wǎng)頁(yè)授權(quán)登錄,并獲取用戶信息

    1  本地開(kāi)發(fā)環(huán)境準(zhǔn)備

        修改hosts文件將dev.foo.com映射到127.0.0.1;
        本地服務(wù)器以80端口啟動(dòng), windows下可能會(huì)出現(xiàn)80端口被系統(tǒng)進(jìn)程占用的情況,解決方法可參考 http://www.cnblogs.com/littleatp/p/4414578.html
        本地服務(wù)器啟動(dòng)后,以dev.foo.com的域名進(jìn)行訪問(wèn),在QQ登錄授權(quán)時(shí)可通過(guò)域名驗(yàn)證這一步

    2  登錄跳轉(zhuǎn)頁(yè)面

<html>     <head>        <title>QQ登錄跳轉(zhuǎn)</title>        <script src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>                <script type="text/javascript">                //切割字符串轉(zhuǎn)換參數(shù)表        function toParamMap(str){             var map = {};             var segs = str.split("&");             for(var i in segs){                 var seg = segs[i];                 var idx = seg.indexOf('=');                 if(idx < 0){                     continue;                 }                 var name = seg.substring(0, idx);                 var value = seg.substring(idx+1);                 map[name] = value;             }             return map;         }                //隱式獲取url響應(yīng)內(nèi)容(JSONP)        function openImplict(url){            var script = document.createElement('script');            script.src = url;            document.body.appendChild(script);                }                //獲得openid的回調(diào)        function callback(obj)        {           var openid = obj.openid;           $("#openid").text(openid);                      //跳轉(zhuǎn)服務(wù)端登錄url           var resulturl = "@{openapi.QQs.login_result()}";            var accessToken = $("#accessToken").text();                      //向服務(wù)端傳輸access_token及openid參數(shù)           document.location.href=resulturl + "?access_token=" + accessToken + "&openid=" + openid;        }                        </script>     </head>          <body>            <p>AccessToken:<span id="accessToken"></span>--ExpireIn<span id="expire"></span></p>            <p>OpenID:<span id="openid"></span></p>          <!-- 執(zhí)行腳本 -->     <script type="text/javascript">          //應(yīng)用的APPID     var appID = "101207268";          //登錄授權(quán)后的回調(diào)地址,設(shè)置為當(dāng)前url     var redirectURI = "@@{openapi.QQs.login()}";     //初始構(gòu)造請(qǐng)求     if (window.location.hash.length == 0)     {        var path = 'https://graph.qq.com/oauth2.0/authorize?';        var queryParams = ['client_id=' + appID,                           'redirect_uri=' + redirectURI,                           'scope=' + 'get_user_info,list_album,upload_pic,add_feeds,do_like','response_type=token'];        var query = queryParams.join('&');        var url = path + query;        window.location.href= url;     }     //在成功授權(quán)后回調(diào)時(shí)location.hash將帶有access_token信息,開(kāi)始獲取openid     else     {        //獲取access token        var accessToken = window.location.hash.substring(1);        var map = toParamMap(accessToken);                //記錄accessToken        $("#accessToken").text(map.access_token);        $("#expire").text(map.expires_in);                //使用Access Token來(lái)獲取用戶的OpenID        var path = "https://graph.qq.com/oauth2.0/me?";        var queryParams = ['access_token='+map.access_token, 'callback=callback'];        var query = queryParams.join('&');        var url = path + query;        openImplict(url);     }          </script>     </body></html>
        功能描述
        頁(yè)面在第一次打開(kāi)時(shí)跳轉(zhuǎn)到QQ登錄授權(quán)頁(yè)面;
        授權(quán)成功之后回到當(dāng)前頁(yè)面通過(guò)url參數(shù)(hash串)獲得accessToken;
        此后可通過(guò)jsonp方式獲取用戶的openid,url如:
https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN
        獲取到用戶OpenID,返回包如下(JSONP方式獲取):
callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} )
         將access_token及openid傳到服務(wù)端進(jìn)行處理

   3  server端獲取用戶信息

     接收openid的頁(yè)面方法
      /**     * 登錄結(jié)果     *     * @param access_token     * @param openid     */    public static void login_result(String access_token, String openid) {        //調(diào)用api獲取qq用戶信息        QQUserInfo user = QQApi.getUserInfo(access_token, openid);         //此時(shí)若取得user信息,則可以進(jìn)行保存,并執(zhí)行用戶登錄操作        ....                //登錄成功后跳轉(zhuǎn)        redirect(xxx);    }

 

    QQApi的實(shí)現(xiàn) 
/** * QQ互聯(lián)API *  * <pre> * 登錄流程: *  * 1 前端跳轉(zhuǎn)qq授權(quán)頁(yè)面 * 2 js獲得access_token * 3 通過(guò)jsonp方式獲得openid * 4 server端根據(jù)上傳的access_token及openid獲取用戶信息,如昵稱、頭像 *  * 參考文檔: * http://wiki.connect.qq.com/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_client-side#Step2.EF.BC.9A.E8.8E.B7.E5.8F.96AccessToken * </pre> *  * @author xxx * @createDate 2015年3月10日 *  */public class QQApi {    public static String appId = "xxx";    public static String appSecret = "xxx";    public static String baseUrl = "https://graph.qq.com";    protected static final String URL_GET_USERINFO = baseUrl            + "/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s";    protected static final long ACCESS_TIMEOUT = 15;    protected static final String DEF_APP_TOKEN_EXPIRE = "3h";    /**     * 獲取用戶信息     *      * <pre>     * http://wiki.connect.qq.com/get_user_info     *      *      * 調(diào)用地址:     * https://graph.qq.com/user/get_user_info     * 參數(shù)     *   access_token=*************&     *   oauth_consumer_key=12345&     *   openid     *      * 返回結(jié)果如下:     * {     *     "ret": 0,     *     "msg": "",     *     "is_lost": 0,     *     "nickname": "小吞",     *     "gender": "女",     *     "province": "廣東",     *     "city": "廣州",     *     "year": "1993",     *     "figureurl": "http://qzapp.qlogo.cn/qzapp/101207268/982C9FEADAF7B242C5069B8F390784BF/30",     *     "figureurl_1": "http://qzapp.qlogo.cn/qzapp/101207268/982C9FEADAF7B242C5069B8F390784BF/50",     *     "figureurl_2": "http://qzapp.qlogo.cn/qzapp/101207268/982C9FEADAF7B242C5069B8F390784BF/100",     *     "figureurl_qq_1": "http://q.qlogo.cn/qqapp/101207268/982C9FEADAF7B242C5069B8F390784BF/40",     *     "figureurl_qq_2": "http://q.qlogo.cn/qqapp/101207268/982C9FEADAF7B242C5069B8F390784BF/100",     *     "is_yellow_vip": "0",     *     "vip": "0",     *     "yellow_vip_level": "0",     *     "level": "0",     *     "is_yellow_year_vip": "0"     * }     * </pre>     *      * @param accessToken     * @return     */    public static QQUserInfo getUserInfo(String accessToken, String openid) {        if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(openid)) {            return null;        }        String url = String.format(URL_GET_USERINFO, accessToken, appId, openid);        String resultString = DefaultHttp.get(url, ACCESS_TIMEOUT, GlobalConstants.UTF_8);        Logger.debug("[sso-qq]get userinfo. use url '%s'", url);        QQUserInfo userinfo = JsonUtil.fromJson(resultString, QQUserInfo.class);        if (userinfo == null || !userinfo.hasGot()) {            Logger.debug("[sso-qq]get userinfo failed, with result of '%s'", resultString);            return null;        }        Logger.debug("[sso-qq]get userinfo success, with result of '%s'", resultString);        return userinfo;    }

常見(jiàn)問(wèn)題

網(wǎng)頁(yè)跳轉(zhuǎn)提示 "redirect_uri_mismatch"
        通常是應(yīng)用配置中的域名與當(dāng)前開(kāi)發(fā)服務(wù)器訪問(wèn)地址不一致導(dǎo)致,參照案例中的本地開(kāi)發(fā)環(huán)境準(zhǔn)備小節(jié)
api調(diào)用返回錯(cuò)誤
        查看返回的ret字段,對(duì)于非0值的ret則表示異常結(jié)果,可通過(guò)以下地址查詢錯(cuò)誤原因:
接口調(diào)用過(guò)于頻繁或超過(guò)限制
        應(yīng)用系統(tǒng)可做好access_token的存儲(chǔ),此外對(duì)于用戶數(shù)據(jù)(昵稱、頭像)也做好緩存或持久化,以減少接口的調(diào)用頻度。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
集成QQ、
關(guān)于使用QQ、新浪微博、騰訊微博等第三方登錄網(wǎng)站的開(kāi)發(fā)過(guò)程(二)?
OAuth2.0實(shí)戰(zhàn)1(分析簡(jiǎn)書(shū)的微信登陸及實(shí)現(xiàn))
191119_01 網(wǎng)站集成QQ第三方登錄
C#.QQ.OAuth2.0
微信企業(yè)號(hào)開(kāi)發(fā)步驟
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服