精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java實現QQ登錄和微博登錄

開發 后端
個人網站最近增加了評論功能,為了方便用戶不用注冊就可以評論,對接了 QQ 和微博這 2 大常用軟件的一鍵登錄,總的來說其實都挺簡單的,可能會有一點小坑,但不算多,完整記錄下來方便后來人快速對接。

[[277884]]

1. 前言

個人網站最近增加了評論功能,為了方便用戶不用注冊就可以評論,對接了 QQ 和微博這 2 大常用軟件的一鍵登錄,總的來說其實都挺簡單的,可能會有一點小坑,但不算多,完整記錄下來方便后來人快速對接。

2. 后臺設計

在真正開始對接之前,我們先來聊一聊后臺的方案設計。既然是對接第三方登錄,那就免不了如何將用戶信息保存。首先需要明確一點的是,用戶在第三方登錄成功之后,我們能拿到的僅僅是一個代表用戶唯一身份的ID(微博是真實uid,QQ是加密的openId)以及用來識別身份的accessToken,當然還有昵稱、頭像、性別等有限資料,對接第三方登錄的關鍵就是如何確定用戶是合法登錄,如果確定這次登錄的和上次登錄的是同一個人并且不是假冒的。

其實這個并不用我們特別操心,就以微博登錄為例,用戶登錄成功之后會回調一個code 給我們,然后我們再拿code去微博那換取accessToken,如果這個code是用戶亂填的,那這一關肯定過不了,所以,前面的擔心有點多余。

另外一個問題就是如何和現有用戶系統打通,有的網站在用戶已經登錄成功之后還要用戶輸入手機號和驗證碼,或者要用戶重新注冊賬號和密碼來綁定第三方賬戶,感覺這種實現用戶體驗非常差,碰到這種網站我一般都是直接關掉,都已經登錄了還讓用戶注冊,什么鬼!由于我做的是評論功能,我并不希望評論用戶和現有用戶表打通,所以就不存在這件事了,如果想打通的話,我覺得無非就是登錄成功之后默認往老用戶表插入一條數據,然后和OpenUser表關聯起來,判斷用戶是否登錄時把OpenUser的鑒權也加進去就OK了。

本文的后臺以Java為例。

2.1. 數據庫設計

再來說說數據庫設計,為了系統的擴展性,我有一個專門的OpenUser表用來存放第三方登錄用戶,主要字段如下:

 

這樣設計理論上就可以無限擴展了。

 

 

2.2. 鑒權流程

這里我只是說說我的方案,把accessToken寫入cookie肯定是不安全的,因為accessToken相當于是第三方網站的臨時密碼,被別人竊取了就可以隨意拿來干壞事了。可以在用戶登錄成功之后我們自己生成一個token,這樣的token即使泄露了頂多就是被人拿來隨意評論,損失不大,但是如果accessToken被泄露了,以微博為例,人家可以利用這個accessToken隨意發微博、刪微博、加關注等等,很危險。當然,如果不想token泄露的話也可以通過綁定IP等方式來限制。鑒權的話就是首先判斷cookie中是否有我們自己的token,然后判斷是否合法,合法再判斷第三方授權是否已過期等等。

QQ登陸

3.1. 實名認證

QQ登錄我們對接的是QQ互聯,地址:https://connect.qq.com ,首先需要注冊成為開發者并實名認證,需要手持身份證照片,具體就不講了。

3.2. 創建應用

進入應用管理頁面(https://connect.qq.com/manage.html#/)創建應用,根據實際需要是創建網站應用還是移動應用,我這里是網站應用:

 

 

 

 

第一步:

 

 

 

 

第二步:

 

 

 

 

提交完之后會自動提交審核,基本上就是審核你的資料和備案的資料是否一致,所有資料必須和備案資料一模一樣,否則審核不會通過:

 

 

 

 

當然,這些資料后面還是可以修改的。申請成功之后你會得到appId和appKey。

3.3. 引導用戶登錄

這里可以下載一些視覺素材,在頁面合適位置放一個QQ登錄按鈕,點擊時引導用戶進入授權頁面:

 

 

 

 

代碼:

  1. function openWindow(url, width, height) 
  2.     width = width || 600; 
  3.     height = height || 400; 
  4.     var left = (window.screen.width - width) / 2; 
  5.     var top = (window.screen.height - height) / 2; 
  6.     window.open(url, "_blank""toolbar=yes, location=yes, directories=no, status=no, menubar=yes, scrollbars=yes, resizable=no, copyhistory=yes, left="+left+", top="+top+", width="+width+", height="+height); 
  7.  
  8. function qqLogin() 
  9.     var qqAppId = '424323422'; // 上面申請得到的appid 
  10.     var qqAuthPath = 'http://www.test.com/auth'; // 前面設置的回調地址 
  11.     var state = 'fjdslfjsdlkfd'; // 防止CSRF攻擊的隨機參數,必傳,登錄成功之后會回傳,最好后臺自己生成然后校驗合法性 
  12.     openWindow(`https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=${qqAppId}&redirect_uri=${encodeURIComponent(qqAuthPath)}&state=${state}`); 

然后會打開一個授權頁面,這個頁面大家應該都熟悉:

 

 

 

 

然后到了這里我就碰到一個問題了,官方文檔(https://wiki.connect.qq.com)寫的是登錄成功之后首先會回傳一個code,然后再拿code調接口換取accessToken,然后我試了很多次也換過2個賬號發現每次都是直接返回了accessToken,幫我省了一步了,不知道是什么情況,郁悶。微信搜索 Web項目聚集地 獲取更多實戰教程。

3.4. 拿到accessToken

現在假設我們都是直接拿到accessToken(因為我暫時還沒搞明白QQ為啥會直接返回,跟文檔說的不一樣),但是授權回調時accessToken會被放在 # 后面,URL地址中的hash值好像不會被傳到后臺(貌似是這樣,如有不正確歡迎評論指正),所以只能寫一個下面這樣的臨時頁面:

  1. @RequestMapping("/authqq"
  2. public void authQQ(HttpServletRequest request, HttpServletResponse response) throws Exception 
  3.     // QQ登錄有點特殊,參數放在#后面,后臺無法獲取#后面的參數,只能用JS做中間轉換 
  4.     String html =   "<!DOCTYPE html>" + 
  5.                     "<html lang=\"zh-cn\">" + 
  6.                     "<head>" + 
  7.                     "   <title>QQ登錄重定向頁</title>" + 
  8.                     "   <meta charset=\"utf-8\"/>" + 
  9.                     "</head>" + 
  10.                     "<body>" + 
  11.                     "   <script type=\"text/javascript\">" + 
  12.                     "   location.href = location.href.replace('#', '&').replace('auth_qq', 'auth_qq_redirect');" + 
  13.                     "    
  14. </script> 
  15. " + 
  16.                     "</body>" + 
  17.                     "</html>"
  18.     response.getWriter().print(html); 

3.5. 獲取openId

根據accessToken調接口獲取用戶的openId,特別注意這個openId是相對于QQ號+appId唯一的,換句話說同一個QQ號登錄2個不同appId時獲取到的openId是不同的。順便說一句,QQ登錄的相關接口做的還真夠“隨便”的,全部都是最簡單的get請求,所以對接起來非常順利。 微信搜索 Web項目聚集地 獲取更多實戰教程。直接看代碼:

  1. // 根據accessToken換取openId 
  2. // 錯誤示例:callback( {"error":100016,"error_description":"access token check failed"} ); 
  3. // 正確示例:callback( {"client_id":"10XXXXX49","openid":"CF2XXXXXXXX9F4C"} ); 
  4. String result = HttpsUtil.get("https://graph.qq.com/oauth2.0/me?access_token=" + accessToken); 
  5. Map<String, Object> resp = parseQQAuthResponse(result); // 這個方法就是把結果轉Map 
  6. // 歡迎關注 Web項目聚集地 獲取更多實戰教程 
  7. Integer errorCode = (Integer)resp.get("error"); 
  8. String errorMsg = (String)resp.get("error_description"); 
  9. String openId = (String)resp.get("openid"); 
  10. if(errorCode != nullreturn new ErrorResult(errorCode, "獲取QQ用戶openId失敗:"+errorMsg); 

3.6. 獲取用戶頭像昵稱等信息

  1. // 獲取用戶昵稱、頭像等信息,{ret: 0, msg: '', nickname: '', ...} ret不為0表示失敗 
  2. result = HttpsUtil.get("https://graph.qq.com/user/get_user_info?access_token="+accessToken+"&oauth_consumer_key="+appId+"&openid="+openId); 
  3. resp = JsonUtil.parseJsonToMap(result); 
  4. // 歡迎關注 Web項目聚集地 獲取更多實戰教程 
  5. Integer ret = (Integer)resp.get("ret"); 
  6. String msg = (String)resp.get("msg"); 
  7. if(ret != 0) return new ErrorResult("獲取用戶QQ信息失敗:"+msg); 
  8.  
  9. // 用戶昵稱可能存在4個字節的utf-8字符,MySQL默認不支持,直接插入會報錯,所以過濾掉 
  10. String nickname = StringUtil.filterUtf8Mb4((String)resp.get("nickname")).trim(); // 這個方法可以自行百度 
  11. // figureurl_qq_2=QQ的100*100頭像,figureurl_2=QQ 100&100空間頭像,QQ頭像不一定有,空間頭像一定有 
  12. String avatar = (String)resp.get("figureurl_qq_2"); 
  13. if(StringUtil.isBlank(avatar)) avatar = (String)resp.get("figureurl_2"); 
  14. String gender = (String)resp.get("gender"); 

3.7. 注意事項

到了這一步基本上涉及第三方的就結束了,是不是很簡單?后面無非就是如何插入數據庫、如何保存token、寫入session等。有幾點注意事項:

需要注意數據庫中是否已經有改用戶,沒有的添加,有的修改,不要重復添加了;

QQ昵稱昵稱有各種奇奇怪怪的字符,包括emoji,MySQL默認沒有開啟utf8mb4,直接插入會報錯,所以需要過濾掉;

  • 需要做好對各種錯誤的兼容;
  • 接口會同時返回QQ頭像和空間頭像,QQ頭像不一定有,空間頭像一定有;
  • 回調地址必須和申請的域名一致,否則會報錯。
  • QQ互聯有個特大的bug,有時候顯示已登錄但是點擊授權管理一直報錯,此時只需要退出重新登錄即可;
  • 授權之后用戶可能會在過期之前提前取消授權;
  • 微信搜索 Web項目聚集地 獲取更多實戰教程。

相關文檔官網已經寫得比較細了,但是比較亂:http://wiki.connect.qq.com/

對接微博登陸

4.1. 實名認證

這個我就不具體講了,登錄 http://open.weibo.com/ 很容易找到相關入口,注冊成為開發者,實名認證,一模一樣的。

4.2. 創建應用

點擊鏈接 http://open.weibo.com/apps/new?sort=web 創建web應用:

 

 

 

 

創建成果后完善相關信息,主要是下面這些:

 


 

 

我就不一一介紹了,都看得懂。微博登錄不需要網站一定要備案,但對網站本身有一定要求,不能弄一個空殼網站讓人家去審核,肯定審核不通過的。

有關微博的對接可以參考我好幾年前寫的一篇文章:

http://www.cnblogs.com/liuxianan/archive/2012/11/11/2765123.html

4.3. 引導用戶登錄

微博視覺素材(https://open.weibo.com/wiki/微博標識下載)下載在這里,頁面合適位置放一個登錄按鈕:

  1. function weiboLogin() 
  2.     let weiboAppId = '432432'
  3.     let weiboAuthPath = 'http://www.test.com/authweibo'
  4.     openWindow(`https://api.weibo.com/oauth2/authorize?client_id=${weiboAppId}&response_type=code&redirect_uri=${encodeURIComponent(weiboAuthPath)}`); 

微博登錄有一個好處,第一次登錄需要授權,后面第二次登錄時只會一閃而過自動就登錄成功了,都不需要點一下,用戶體驗非常好,看下圖:

 

 

4.4. 獲取accessToken

登錄成功會返回一個code,根據code換取accessToken:

  1. String params = "client_id=" + appId 
  2.         + "&client_secret=" + appSecret 
  3.         + "&grant_type=authorization_code" 
  4.         + "&redirect_uri=" + URLUtil.encode(authPath) 
  5.         + "&code=" + code; 
  6. // 用code換取accessToken 
  7. String result = HttpsUtil.post("https://api.weibo.com/oauth2/access_token", params); 
  8. Map<String, Object> resp = JsonUtil.toObject(result, new TypeReference<Map<String, Object>>(){}); 
  9.  
  10. Integer errorCode = (Integer)resp.get("error_code"); 
  11. String error = (String)resp.get("error"); 
  12. String errorMsg = (String)resp.get("error_description"); 
  13. if(errorCode != null && errorCode != 0) return new ErrorResult(errorCode, error + (errorMsg==null?"":errorMsg)); 
  14. String accessToken = (String)resp.get("access_token"); 
  15. String uid = (String)resp.get("uid"); // 這個uid就是微博用戶的唯一用戶ID,可以通過這個id直接訪問到用戶微博主頁 
  16. int expires = (Integer)resp.get("expires_in"); // 有效期,單位秒 

4.5. 獲取用戶頭像等信息

  1. // 用uid和accessToken換取用戶信息 
  2. String result = HttpsUtil.get("https://api.weibo.com/2/users/show.json?access_token="+accessToken+"&uid="+uid); 
  3. Map<String, Object> resp = JsonUtil.toObject(result, new TypeReference<Map<String, Object>>(){}); 
  4.  
  5. errorCode = (Integer)resp.get("error_code"); 
  6. error = (String)resp.get("error"); 
  7. errorMsg = (String)resp.get("error_description"); 
  8. if(errorCode != null && errorCode != 0) return new ErrorResult(errorCode, error + (errorMsg==null?"":errorMsg)); 
  9.  
  10. String nickname = (String)resp.get("screen_name"); 
  11. // 微博180*180高清頭像 
  12. String avatar = (String)resp.get("avatar_large"); 
  13. String gender = (String)resp.get("gender"); 
  14. gender = "m".equals(gender) ? "男" : ("f".equals(gender) ? "女" : ""); 

至此涉及第三方的東西都完了,剩下的就是用戶自己保存到數據庫、寫入token保存 session 以及鑒權接口開發了。

4.6. 注意事項

  • 微博接口都有頻率限制,不過一般不會超過;
  • 需做好錯誤兼容;
  • 微博直接返回的uid,可以根據這個uid直達用戶微博主頁 https://weibo.com/u/xxxxx ,所以可以把用戶頭像鏈接到這里;
  • 其實也有現成的js-sdk,可以根據自己實際需要選擇是否使用;
  • 微博的接口是https,并且是post,需要注意;

 

責任編輯:龐桂玉 來源: Java團長
相關推薦

2017-09-21 10:02:02

Java網頁爬蟲Httpclient

2012-02-15 17:39:36

2014-11-04 10:30:32

新浪微博可登錄任意賬戶

2021-12-06 09:44:30

鴻蒙HarmonyOS應用

2012-03-16 10:45:43

Java

2015-08-07 15:32:19

歡迎界面仿微信仿qq空間

2023-03-26 00:00:00

2015-10-23 14:53:25

qq授權登陸

2021-12-06 16:35:33

QQ微博社交軟件

2012-05-31 13:59:43

PHP

2015-04-16 10:35:08

微博微博如何實現

2020-07-16 10:13:54

安全 信息安全人臉識別

2021-11-26 22:25:48

QQQQ音樂移動應用

2019-11-27 19:29:17

QQ微信移動應用

2021-03-05 06:39:54

指紋Web識別

2015-08-28 09:40:39

自動登錄webapp

2010-06-04 10:12:43

馬化騰

2018-01-29 14:01:17

htmljavascriptApp

2016-12-22 09:11:24

Windows 10Windows 8Windows 7
點贊
收藏

51CTO技術棧公眾號

99精品一区二区三区无码吞精| 国产精品一区二区三区观看| 一区二区三区在线播放视频| 久久99成人| 亚洲欧美国产三级| 精品久久久久久综合日本| 少妇太紧太爽又黄又硬又爽| 久久国产精品亚洲人一区二区三区 | 亚洲国产国产亚洲一二三| 精品在线观看国产| 国内自拍第二页| 男女视频在线| 久久久精品国产免费观看同学| 成人午夜高潮视频| av黄色在线看| 午夜日韩视频| 这里只有视频精品| www.17c.com喷水少妇| jizzjizz少妇亚洲水多| 亚洲二区在线观看| 亚洲乱码一区二区三区| 欧美一区二区三区黄片| 开心九九激情九九欧美日韩精美视频电影 | 动漫一区在线| 久久久影院官网| 99在线观看视频| 中国精品一区二区| 国产精品视频久久一区| 欧美高清一级大片| 九一在线免费观看| 一本色道久久综合狠狠躁的番外| 欧美一二三区在线| 成人av毛片在线观看| 欧美freesex| 天天爽夜夜爽夜夜爽精品视频| 黄瓜视频免费观看在线观看www| 四虎精品在线| 成人动漫在线一区| 亚洲一区二区三区久久 | 成人福利电影| 亚洲摸摸操操av| 亚洲高清资源综合久久精品| 你懂的视频在线| 99r国产精品| 国产欧美日韩在线播放| 性猛交富婆╳xxx乱大交天津| 久久爱www久久做| 国产精品成人播放| 波多野结衣啪啪| 国产精品亚洲欧美| 9.1国产丝袜在线观看| 日韩久久精品视频| 亚洲理伦在线| 欧美亚洲国产日韩2020| 国产香蕉视频在线| 国产欧美午夜| 日韩免费精品视频| 国产一级淫片a视频免费观看| 国产日韩亚洲| 欧洲成人午夜免费大片| 台湾佬中文在线| 久热精品视频| 国产精品综合久久久| 中文字幕av片| 另类欧美日韩国产在线| 成人激情春色网| 国产免费视频一区二区三区| 国产乱码精品一品二品| 3d动漫啪啪精品一区二区免费| a天堂视频在线| 成熟亚洲日本毛茸茸凸凹| 国产精品免费看一区二区三区| 日本久久一级片| 久久伊99综合婷婷久久伊| 97国产精品人人爽人人做| 国产精品卡一卡二| 国产精品99久久免费观看| 日韩伦理视频| 亚洲美女又黄又爽在线观看| 国产女主播喷水高潮网红在线| 免费av一区| 中文字幕成人精品久久不卡| www日韩在线| 影院欧美亚洲| 日韩免费精品视频| 国产精品久久久久久免费播放| 国产精品一区二区你懂的| 国产精品一 二 三| 欧美成人免费| 最新欧美精品一区二区三区| 999一区二区三区| 在线看片福利| 91精品国产欧美一区二区成人| 日批免费观看视频| 国产一区二区三区日韩精品| 久久久成人的性感天堂| 久久久久久久99| 日韩电影免费一区| 99re在线播放| 黄色片在线免费看| 一区二区三区日韩| 久久久久国产精品熟女影院| 欧美第一在线视频| 亚洲视频欧美视频| 日本a级片视频| 亚洲欧美春色| 91最新在线免费观看| 天堂av在线7| 亚洲欧美另类小说| 午夜免费精品视频| 精品伊人久久久| 日韩在线播放一区| 在线精品免费视| 国产精品影视网| 日本一区二区免费看| 人妖欧美1区| 欧美日韩和欧美的一区二区| 日本人妻一区二区三区| 久久精品视频7| 欧美啪啪一区| 国产精品久久在线观看| 免费观看国产视频| 怡红院av一区二区三区| 9久久婷婷国产综合精品性色| 2023国产精华国产精品| 日韩中文字幕欧美| 99久久久久久久久| 99久久国产综合色|国产精品| 免费观看黄色的网站| 黑人巨大精品欧美一区二区桃花岛| 日韩欧美一卡二卡| 夫妻性生活毛片| 蜜臀av性久久久久蜜臀aⅴ| 精品国产中文字幕| 黑人玩欧美人三根一起进| 在线不卡中文字幕| 免费成人深夜蜜桃视频| 丝瓜av网站精品一区二区| 精品久久久三级| 极品av在线| 亚洲国产成人爱av在线播放| 青青操国产视频| 国内久久婷婷综合| 亚洲一区在线直播| 成人国产一区| 色播久久人人爽人人爽人人片视av| 亚洲av无码精品一区二区| 91免费观看在线| 日韩欧美一区三区| 欧美亚洲大陆| 国产91精品高潮白浆喷水| 少妇一区二区三区四区| 亚洲成人在线观看视频| 最新版天堂资源在线| 亚洲一级一区| 国产伦精品一区二区三区四区免费| 欧洲性视频在线播放| 欧美成人伊人久久综合网| 久久免费视频播放| av网站一区二区三区| 男人用嘴添女人下身免费视频| 精品久久ai| 欧美最顶级的aⅴ艳星| 免费a在线观看| 91九色02白丝porn| 久久久久麻豆v国产| 国产一区二区不卡在线| 成人毛片100部免费看| 色妞ww精品视频7777| 国产69精品久久久久99| 日韩亚洲视频在线观看| 一本久久综合亚洲鲁鲁五月天| 中文字幕精品三区| 一区二区三区免费看| 在线日韩三级| 久久久久久久久久久亚洲| 天堂在线视频观看| 一本色道亚洲精品aⅴ| 国产又黄又粗视频| 国精品**一区二区三区在线蜜桃| 成人在线观看毛片| 欧美性生活一级片| 国产免费一区视频观看免费| 在线观看午夜av| 日韩av在线网站| 日韩欧美一级大片| 亚洲精品免费一二三区| 亚洲精品乱码久久久久久不卡| 日韩黄色免费网站| 波多野结衣 作品| 亚洲宅男网av| 91色在线视频| 中文字幕不卡三区视频| 久久精品久久久久| 无码精品人妻一区二区| 4438x亚洲最大成人网| 亚洲精品在线观看av| 国产欧美一区二区精品仙草咪| 加勒比av中文字幕| 羞羞视频在线观看欧美| 亚洲伊人婷婷| 一本色道久久综合狠狠躁的番外| 成人性教育视频在线观看| 无码小电影在线观看网站免费| 中文字幕久热精品视频在线| 欧美 日韩 综合| 欧美日韩国产精品自在自线| 中文字幕一区二区三区精品 | 99国产精品久久久久久久| 天堂va久久久噜噜噜久久va| 动漫av一区| 国产日韩欧美自拍| 亚洲欧美电影| 欧美激情欧美狂野欧美精品| 日本精品一区二区三区在线播放| 亚洲第一天堂av| 国产免费无遮挡| 欧美在线观看一区二区| 1级黄色大片儿| 一级女性全黄久久生活片免费| 中文字幕欧美激情极品| 91香蕉国产在线观看软件| 日韩精品xxx| 精品一区二区三区久久久| 色婷婷综合久久久久中文字幕 | 久久久久这里只有精品| 秋霞成人影院| 在线播放日韩av| 日本一级在线观看| 亚洲精品动漫久久久久| 午夜精品久久久久久久99 | 一级做a免费视频| 丝袜国产日韩另类美女| 亚洲 高清 成人 动漫| 欧美日韩99| 最近免费观看高清韩国日本大全| 日韩一区二区在线免费| 日本一区二区精品| 精品久久久亚洲| 久久青青草原| 欧美丝袜美腿| 欧美性bbwbbwbbwhd| 久久综合五月婷婷| 国产精品综合久久久久久| 亚洲一区二区三区四区电影| 51国偷自产一区二区三区| 亚洲欧美在线综合| 成人亚洲综合色就1024| av在线亚洲一区| 91久久在线视频| 精品入口麻豆88视频| 成人做爰www免费看视频网站| 韩国理伦片久久电影网| 国产精品最新在线观看| а天堂中文最新一区二区三区| 成人福利在线观看| 精品视频一二| 国产精选在线观看91| 欧美日韩直播| 欧洲精品码一区二区三区免费看| 国际精品欧美精品| 亚洲欧美日产图| 亚洲mv大片欧洲mv大片| 日本免费成人网| 国产午夜久久| 999在线免费视频| 久久99久久99精品免视看婷婷| www.国产福利| 懂色av中文一区二区三区| 日本一区二区免费视频| 91美女视频网站| 国产又黄又粗的视频| 中文字幕一区二区三中文字幕| 欧美成人一二三区| 香蕉成人伊视频在线观看| 91美女免费看| 色先锋aa成人| 99精品免费观看| 亚洲国产成人精品久久久国产成人一区| 性xxxx视频| 深夜福利91大全| 电影k8一区二区三区久久| 日本高清不卡在线| 99精品国自产在线| 91超碰在线免费观看| 日本一道高清一区二区三区| 亚洲精品在线观看免费| 欧美日本一区| 9久久婷婷国产综合精品性色| 国产精品综合网| 中文字幕一二三四区| 亚洲色图在线看| 欧美日韩综合在线观看| 欧美老女人在线| 天天干天天色天天| 日韩一区视频在线| 亚洲天堂电影| 成人写真视频福利网| 最新亚洲精品| 4444亚洲人成无码网在线观看| 老司机午夜精品视频| 丰满人妻一区二区三区大胸| 久久综合九色综合欧美亚洲| 艳妇荡乳欲伦69影片| 色综合视频一区二区三区高清| 国产黄a三级三级三级| 亚洲人成电影网站色xx| 欧美videossex| 国产精品丝袜高跟| 亚洲欧洲av| 波多野结衣与黑人| 老司机精品视频导航| 久久久久久国产精品无码| 夜夜嗨av一区二区三区四季av| 中文字幕乱码在线观看| 亚洲精品国产免费| 日韩激情美女| 国产精品综合不卡av| 国产欧美久久一区二区三区| 免费一级特黄毛片| 国产原创一区二区三区| 亚洲ⅴ国产v天堂a无码二区| 婷婷中文字幕综合| 性生交生活影碟片| 久久久成人av| 综合欧美精品| 亚洲激情啪啪| 日韩电影一二三区| 欧洲美一区二区三区亚洲 | 日韩在线视频导航| 欧美极度另类| 久久综合九色99| 雨宫琴音一区二区在线| 亚洲一区和二区| 亚洲人xxxx| 国产视频在线免费观看| 日韩亚洲在线观看| 韩国精品视频在线观看| 午夜精品亚洲一区二区三区嫩草| 免费在线成人| 最新中文字幕视频| 欧美日韩在线视频首页| 日韩一级片免费| 午夜精品免费视频| 久久夜色电影| 欧美 国产 日本| 91麻豆精品在线观看| 狠狠躁夜夜躁人人爽天天高潮| 精品国产一二三| 超碰在线99| 国内精品**久久毛片app| 夜夜嗨av一区二区三区网站四季av| 中文字幕 欧美 日韩| 亚洲v精品v日韩v欧美v专区| 殴美一级特黄aaaaaa| 97超级碰碰碰久久久| 中文字幕av一区二区三区人| 黄色高清无遮挡| 国产精品你懂的| 国产乱码久久久久| 欧美精品在线第一页| 亚洲一区二区三区日本久久九| 蜜臀av无码一区二区三区| 91亚洲精品久久久蜜桃| 欧美 日韩 精品| 永久免费毛片在线播放不卡| 伊人久久精品| 日韩a级黄色片| 97se亚洲国产综合在线| 无码视频在线观看| 日韩中文字幕在线视频| 久久亚洲精精品中文字幕| 久久手机在线视频| 91麻豆福利精品推荐| 免费在线不卡av| 久久综合伊人77777| 精品嫩草影院| 无需播放器的av| 一级精品视频在线观看宜春院 | 久久众筹精品私拍模特| 中文字幕在线视频免费| 欧美国产一区二区三区| 亚洲第一二三区| 日韩在线一区视频| 亚洲1区2区3区视频| 国产黄色片在线播放| 亚洲最大福利视频网站| 免费视频一区| 成人性生活毛片| 亚洲剧情一区二区| 麻豆国产一区| aaa毛片在线观看| 亚洲乱码一区二区三区在线观看| 四虎精品一区二区三区| 国产精品免费久久久| 国产精品a级| 中文字幕黄色网址| 欧美精品一区二区三| 国内精品伊人| 日本免费一级视频|