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

聊聊微服務架構中的用戶認證方案!

開發 架構
今天主要涉及三方面內容,首先咱們回顧了基于 Session 的有狀態用戶認證解決方案,其次介紹了 JWT 與 JJWT 的使用,最后講解了利用 JWT 實現微服務架構認證的兩種方案,對產生的新問題也進行了梳理。

傳統的用戶認證方案

我們直奔主題,什么是用戶認證呢?對于大多數與用戶相關的操作,軟件系統首先要確認用戶的身份,因此會提供一個用戶登錄功能。用戶輸入用戶名、密碼等信息,后臺系統對其進行校驗的操作就是用戶認證。用戶認證的形式有多種,最常見的有輸入用戶名密碼、手機驗證碼、人臉識別、指紋識別等,但其目的都是為了確認用戶的身份并與之提供服務。

用戶認證用戶認證

在傳統的單體單點應用時代,我們會開發用戶認證的服務類,從登錄界面提交的用戶名密碼等信息通過用戶認證類進行校驗,然后獲取該用戶對象將其保存在 Tomcat 的 Session 中,如下所示:

單點應用認證方案單點應用認證方案

隨著系統流量的增高,單點應用以無法支撐業務運行,應用出現高延遲、宕機等狀況,此時很多公司會將應用改為 Nginx 軟負載集群,通過水平擴展提高系統的性能,于是應用架構就變成了這個樣子。

Java Web 應用集群Java Web 應用集群

雖然改造后系統性能顯著提高,但你發現了么,因為之前用戶登錄的會話數據都保存在本地,當 Nginx 將請求轉發到其他節點后,因為其他節點沒有此會話數據,系統就會認為沒有登錄過,請求的業務就會被拒絕。從使用者的角度會變成一刷新頁面后,系統就讓我重新登錄,這個使用體驗非常糟糕。

我們來分析下,這個問題的根本原因在于利用 Session 本地保存用戶數據會讓 Java Web 應用變成有狀態的,在集群環境下必須保證每一個 Tomcat 節點的會話狀態一致的才不會出問題。因此基于 Redis 的分布式會話存儲方案應運而生,在原有架構后端增加 Redis 服務器,將用戶會話統一轉存至 Redis 中,因為該會話數據是集中存儲的,所以不會出現數據一致性的問題。

Redis 統一存儲用戶會話Redis 統一存儲用戶會話

但是,傳統方案在互聯網環境下就會遇到瓶頸,Redis 充當了會話數據源,這也意味著 Redis 承擔了所有的外部壓力,在互聯網數以億計的龐大用戶群規模下,如果出現突發流量洪峰,Redis 能否經受考驗就會成為系統的關鍵風險,稍有差池系統就會崩潰。

那如何解決呢?其實還有一種巧妙的設計,在用戶認證成功,后用戶數據不再存儲在后端,而改為在客戶端存儲,客戶端每一次發送請求時附帶用戶數據到 Web 應用端,Java 應用讀取用戶數據進行業務處理,因為用戶數據分散存儲在客戶端中,因此并不會對后端產生額外的負擔,此時認證架構會變成下面的情況。

客戶端存儲用戶信息客戶端存儲用戶信息

當用戶認證成功后,在客戶端的 Cookie、LocalStorage 會持有當前用戶數據,在 Tomcat 接收到請求后便可獲取用戶數據進行業務處理。但細心的你肯定也發現,用戶的敏感數據是未經過加密的,在存儲與傳輸過程中隨時都有泄密的風險,決不能使用明文,必須要對其進行加密。

那如何進行加密處理呢?當然,你可以自己寫加解密類,但更通用的做法是使用 JWT 這種標準的加密方案進行數據存儲與傳輸。

Json Web Token(JWT)介紹

無論是微服務架構,還是前后端分離應用,在客戶端存儲并加密數據時有一個通用的方案:Json Web Token(JWT),JWT是一個經過加密的,包含用戶信息的且具有時效性的固定格式字符串。下面這是一個標準的JWT字符串。

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoyLFwidXNlcm5hbWVcIjpcImxpc2lcIixcIm5hbWVcIjpcIuadjuWbm1wiLFwiZ3JhZGVcIjpcInZpcFwifSJ9.NT8QBdoK4S-PbnhS0msJAqL0FG2aruvlsBSyG226HiU

這段加密字符串由三部分組成,中間由點“.”分隔,具體含義如下。

  • 第一部分 標頭(Header):標頭通常由兩部分組成:令牌的類型(即 JWT)和所使用的簽名算法,例如 HMAC SHA256 或 RSA,下面是標頭的原文:
{  
  "alg": "HS256",  
  "typ": "JWT"  
}

然后,此 JSON 被 Base64 編碼以形成 JWT 的第一部分。

eyJhbGciOiJIUzI1NiJ9
  • 第二部分 載荷(Payload):載荷就是實際的用戶數據以及其他自定義數據。載荷原文如下所示。
{  
  "sub": "1234567890",  
  "name": "John Doe",  
  "admin": true  
}

然后對原文進行 Base64 編碼形成 JWT 的第二部分。

eyJzdWIiOiJ7XCJ1c2VySWRcIjoyLFwidXNlcm5hbWVcIjpcImxpc2lcIixcIm5hbWVcIjpcIuadjuWbm1wiLFwiZ3JhZGVcIjpcInZpcFwifSJ9
  • 第三部分 簽名(Sign):簽名就是通過前面兩部分標頭+載荷+私鑰再配合指定的算法,生成用于校驗 JWT 是否有效的特殊字符串,簽名的生成規則如下。
HMACSHA256(base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)

生成的簽名字符串為:

NT8QBdoK4S-PbnhS0msJAqL0FG2aruvlsBSyG226HiU

將以上三部分通過“.”連接在一起,就是 JWT 的標準格式了。

JWT 的創建與校驗

此時,你肯定有疑問 JWT 是如何生成的,又是如何完成有效性校驗呢?因為 JWT 的格式與算法是固定的,在 Java 就有非常多的優秀開源項目幫我們實現了JWT 的創建與驗簽,其中最具代表性的產品就是 JJWT。JJWT 是一個提供端到端的 JWT 創建和驗證的 Java 庫,它的官網是:https://github.com/jwtk/jjwt,有興趣的話你可以到官網閱讀它的源碼。

JJWT 的使用是非常簡單的,下面我們用代碼進行說明,關鍵代碼我已做好注釋。

  • 第一步,pom.xml 引入 JJWT 的 Maven 依賴。
<dependency>  
    <groupId>io.jsonwebtoken</groupId>  
    <artifactId>jjwt-api</artifactId>  
    <version>0.11.2</version>  
</dependency>  
  
<dependency>  
    <groupId>io.jsonwebtoken</groupId>  
    <artifactId>jjwt-impl</artifactId>  
    <version>0.11.2</version>  
    <scope>runtime</scope>  
</dependency>  
  
<dependency>  
    <groupId>io.jsonwebtoken</groupId>  
    <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->  
    <version>0.11.2</version>  
    <scope>runtime</scope>  
</dependency>
  • 第二步,編寫創建 JWT 的測試用例,模擬真實環境 UserID 為 123 號的用戶登錄后的 JWT 生成過程。
@SpringBootTest  
public class JwtTestor {  
    /**  
     * 創建Token  
     */  
    @Test  
    public void createJwt(){  
        //私鑰字符串  
        String key = "1234567890_1234567890_1234567890";  
        //1.對秘鑰做BASE64編碼  
        String base64 = new BASE64Encoder().encode(key.getBytes());  
        //2.生成秘鑰對象,會根據base64長度自動選擇相應的 HMAC 算法  
        SecretKey secretKey = Keys.hmacShaKeyFor(base64.getBytes());  
        //3.利用JJWT生成Token  
        String data = "{\"userId\":123}"; //載荷數據  
        String jwt = Jwts.builder().setSubject(data).signWith(secretKey).compact();  
        System.out.println(jwt);  
    }  
}

運行結果產生 JWT 字符串如下:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoxMjN9In0.1p_VTN46sukRJTYFxUg93CmfR3nJZRBm99ZK0e3d9Hw
  • 第三步,驗簽代碼,從 JWT 中提取 123 號用戶數據。這里要保證 JWT 字符串、key 私鑰與生成時保持一致。否則就會拋出驗簽失敗 JwtException。
/**  
 * 校驗及提取JWT數據  
 */  
@Test  
public void checkJwt(){  
    String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoxMjN9In0.1p_VTN46sukRJTYFxUg93CmfR3nJZRBm99ZK0e3d9Hw";  
    //私鑰  
    String key = "1234567890_1234567890_1234567890";  
    //1.對秘鑰做BASE64編碼  
    String base64 = new BASE64Encoder().encode(key.getBytes());  
    //2.生成秘鑰對象,會根據base64長度自動選擇相應的 HMAC 算法  
    SecretKey secretKey = Keys.hmacShaKeyFor(base64.getBytes());  
    //3.驗證Token  
    try {  
        //生成JWT解析器   
        JwtParser parser = Jwts.parserBuilder().setSigningKey(secretKey).build();  
        //解析JWT  
        Jws<Claims> claimsJws = parser.parseClaimsJws(jwt);  
        //得到載荷中的用戶數據  
        String subject = claimsJws.getBody().getSubject();  
        System.out.println(subject);  
    }catch (JwtException e){  
        //所有關于Jwt校驗的異常都繼承自JwtException  
        System.out.println("Jwt校驗失敗");  
        e.printStackTrace();  
    }  
}

運行結果如下:

{"userId":123}

以上便是 JWT 的生成與校驗代碼,你會發現在加解密過程中,服務器私鑰 key 是保障 JWT 安全的命脈。對于這個私鑰在生產環境它不能寫死在代碼中,而是加密后保存在 Nacos 配置中心統一存儲,同時定期更換私鑰以防止關鍵信息泄露。

講到這應該你已掌握 JWT 的基本用法,但是在微服務架構下又該如何設計用戶認證體系呢?

基于網關的統一用戶認證

關于網關統一用戶認證和鑒權可以看陳某之前的文章:實戰干貨!Spring Cloud Gateway 整合 OAuth2.0 實現分布式統一認證授權!

下面我們結合場景講解 JWT 在微服務架構下的認證過程。這里我將介紹兩種方案:

  • 服務端自主驗簽方案;
  • API 網關統一驗簽方案。

服務端自主驗簽方案

首先咱們來看服務端驗簽的架構圖。

服務端自主驗簽方案服務端自主驗簽方案

首先梳理下執行流程:

  • 第一步,認證中心微服務負責用戶認證任務,在啟動時從 Nacos 配置中心抽取 JWT 加密用私鑰;
  • 第二步,用戶在登錄頁輸入用戶名密碼,客戶端向認證中心服務發起認證請求:
http://usercenter/login #認證中心用戶認證(登錄)地址
  • 第三步,認證中心服務根據輸入在用戶數據庫中進行認證校驗,如果校驗成功則返回認證中心將生成用戶的JSON數據并創建對應的 JWT 返回給客戶端,下面是認證中心返回的數據樣本;
{  
    "code": "0",  
    "message": "success",  
    "data": {  
        "user": {  
            "userId": 1,  
            "username": "zhangsan",  
        },  
        "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoxLFwidXNlcm5hbWVcIjpcInpoYW5nc2FuXCIsXCJuYW1lXCI6XCLlvKDkuIlcIixcImdyYWRlXCI6XCJub3JtYWxcIn0ifQ.1HtfszarTxLrqPktDkzArTEc4ah5VO7QaOOJqmSeXEM"  
    }  
}
  • 第四步,在收到上述 JSON 數據后,客戶端將其中 token 數據保存在 cookie 或者本地緩存中;
  • 第五步,隨后客戶端向具體某個微服務發起新的請求,這個 JWT 都會附加在請求頭或者 cookie 中發往 API 網關,網關根據路由規則將請求與jwt數據轉發至具體的微服務。中間過程網關不對 JWT 做任何處理;
  • 第六步,微服務接收到請求后,發現請求附帶 JWT 數據,于是將 JWT 再次轉發給用戶認證服務,此時用戶認證服務對 JWT 進行驗簽,驗簽成功提取其中用戶編號,查詢用戶認證與授權的詳細數據,數據結構如下所示:
{  
    "code": "0",  
    "message": "success",  
    "data": {  
        "user": { #用戶詳細數據  
            "userId": 1,  
            "username": "zhangsan",  
            "name": "張三",  
            "grade": "normal"  
            "age": 18,  
            "idno" : 130.......,  
            ...  
        },  
        "authorization":{ #權限數據  
            "role" : "admin",  
            "permissions" : [{"addUser","delUser","..."}]  
        }  
    }  
}
  • 第七步,具體的微服務收到上述 JSON 后,對當前執行的操作進行判斷,檢查是否擁有執行權限,權限檢查通過執行業務代碼,權限檢查失敗返回錯誤響應。

到此從登錄創建 JWT 到驗簽后執行業務代碼的完整流程已經完成。

下面咱們來聊一聊第二種方案:

API 網關統一驗簽方案

API 網關統一驗簽方案API 網關統一驗簽方案

API 網關統一驗簽與服務端驗簽最大的區別是在 API 網關層面就發起 JWT 的驗簽請求,之后路由過程中附加的是從認證中心返回的用戶與權限數據,其他的操作步驟與方案一是完全相同的。

在這你可能又會有疑惑,為什么要設計兩種不同的方案呢?其實這對應了不同的應用場景:

服務端驗簽的時機是在業務代碼執行前,控制的粒度更細。比如微服務 A 提供了“商品查詢”與“創建訂單”兩個功能,前者不需要登錄用戶就可以使用,因此不需要向認證中心額外發起驗簽工作;而后者是登錄后的功能,因此必須驗簽后才可執行。因為服務端驗簽是方法層面上的,所以可以精確控制方法是否驗簽。但也有不足,正是因為驗簽是在方法前執行,所以需要在所有業務方法上聲明是否需要額外驗簽,盡管這個工作可以通過 Spring AOP+注解的方式無侵入實現,但這也無疑需要程序員額外關注,分散了開發業務的精力。

相應的,服務端驗簽的缺點反而成為 API 網關驗簽的優勢。API 網關不關心后端的服務邏輯,只要請求附帶 JWT,就自動向認證中心進行驗簽。這種簡單粗暴的策略確實讓模塊耦合有所降低,處理起來也更簡單,但也帶來了性能問題,因為只要請求包含 JWT 就會產生認證中心的遠程通信。如果前端工程師沒有對 JWT 進行精確控制,很可能帶來大量多余的認證操作,系統性能肯定會受到影響。

那在項目中到底如何選擇呢?服務端驗簽控制力度更細,適合應用在低延遲、高并發的應用,例如導航、實時交易系統、軍事應用。而 API 統一網關則更適合用在傳統的企業應用,可以讓程序員專心開發業務邏輯,同時程序也更容易維護。

全新的挑戰

雖然 JWT 看似很美,在實施落地過程中也會遇到一些特有的問題,例如:

JWT 生成后失效期是固定的,很多業務中需要客戶端在不改變 JWT 的前提下,實現 JWT 的“續簽”功能,但這單靠 JWT 自身特性是無法做到的,因為 JWT 的設計本身就不允許生成完全相同的字符串。為了解決這個問題,很多項目在生成的 JWT 設為“永久生效”,架構師利用 Redis 的 Expire 過期特性在后端控制 JWT 的時效性。這么做雖然讓 JWT 本身變得有狀態,但這可能也是在各種權衡后的“最優解”。類似的,例如:強制 JWT 立即失效、動態 JWT 有效期都可以使用這個辦法解決。

圖片圖片

某個 JWT 在 3600 秒后過期

對于上面兩種認證方案,還有優化的空間,比如在服務A第一次對某個 JWT 進行驗簽后獲取用戶與權限數據,那在 JWT 的有效期內便可將數據在本地內存或者 Redis 中進行緩存,這樣下一次同樣的 JWT 訪問時直接從緩存中提取即可,可以節省大量服務間通信時間。但引入緩存后你也要時刻關注緩存與用戶數據的一致性問題,是要性能還是要數據可靠,這又是一個架構師需要面對的抉擇。

小結

今天主要涉及三方面內容,首先咱們回顧了基于 Session 的有狀態用戶認證解決方案,其次介紹了 JWT 與 JJWT 的使用,最后講解了利用 JWT 實現微服務架構認證的兩種方案,對產生的新問題也進行了梳理。

在多年的架構生涯中,我自己也在不斷感慨,架構是一門取舍的藝術,沒有完美的架構,只有適合的場景,希望未來同學們可以多學習一些前沿技術,興許隨著技術發展沒準魚和熊掌真的可以兼得呢。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2023-03-01 08:57:32

2022-11-02 08:31:53

BFF架構App

2024-12-27 10:12:28

2022-08-04 08:46:16

單體架構微服務事務管理

2021-02-07 09:05:56

微服務結構云原生

2023-01-29 09:06:24

微服務劃分關聯

2023-12-15 09:57:13

微服務鏈路服務

2023-09-05 08:53:51

2021-07-20 08:03:43

微服務應用程序

2025-03-11 10:58:00

2022-11-08 08:35:53

架構微服務移動

2018-12-06 14:56:46

微服務隔離熔斷

2018-05-09 08:18:26

微服務改造架構

2020-11-26 18:18:21

微服務業務規模技術

2024-04-19 08:49:50

微服務RPC事件驅動

2025-02-10 02:20:00

微服務SOA架構

2023-07-28 09:23:24

微服務架構

2019-09-29 10:29:02

緩存模式微服務架構

2022-12-31 14:51:48

微服務Golang

2024-03-18 08:48:52

Spring多端認證微服務
點贊
收藏

51CTO技術棧公眾號

国产后入清纯学生妹| 国产精品69久久久久孕妇欧美| 鲁鲁在线中文| 国产日产精品一区| 亚洲bt欧美bt日本bt| 黄色小视频在线免费看| 九一成人免费视频| 制服.丝袜.亚洲.中文.综合| 青青草视频在线免费播放| 成人欧美一区| 大桥未久av一区二区三区中文| 日韩美女视频免费在线观看| 久久中文免费视频| 妖精视频一区二区三区| 日韩一级大片在线| 亚洲不卡视频在线| 国产精品论坛| 一区二区三区四区高清精品免费观看 | 久久电影天堂| 亚洲国产精品久久一线不卡| 亚洲精品一区二区三区樱花 | 亚洲午夜女主播在线直播| 国产亚洲色婷婷久久| 欧美性理论片在线观看片免费| 亚洲精选免费视频| 亚洲不卡1区| 免费av网站观看| 国产在线一区观看| 国产精品第二页| 六月丁香激情综合| 91中文字幕精品永久在线| 亚洲免费av网址| 欧美xxxx×黑人性爽| 日韩成人久久| 91精品国产日韩91久久久久久| 日韩视频在线免费看| av在线加勒比| 亚洲人成影院在线观看| 日韩视频精品| 九色视频在线播放| 久久综合999| 精品国产一区二区三区免费| 亚洲精品第五页| 国产毛片一区二区| 成人久久精品视频| 国产精品久久久久久免费免熟| 日韩在线一区二区三区| 国产成人精品久久二区二区| 五月天婷婷久久| 亚洲深夜av| 午夜精品福利在线观看| 国产性70yerg老太| 激情亚洲成人| 性欧美xxxx| 日韩av在线播| 亚洲欧美日韩专区| 69久久夜色精品国产69| 男人午夜免费视频| 亚洲欧美日韩国产综合精品二区| 啪一啪鲁一鲁2019在线视频| 天堂网中文字幕| 天堂成人国产精品一区| 国产精品户外野外| 亚洲一区在线观| 韩国成人福利片在线播放| 91精品久久久久久久久久另类 | 国产一区二区三区在线观看免费视频| 91精品免费久久久久久久久| 夜夜嗨av禁果av粉嫩avhd| 久久99精品久久久久久久久久久久| 国产欧美精品在线播放| 99热这里精品| 成人一区二区三区中文字幕| 久久久久网址| 91高清在线视频| 亚洲欧美激情插| 国产免费黄色小视频| 欧美大电影免费观看| 欧美日韩精品高清| 午夜影院免费观看视频| 久久中文字幕导航| 国产亚洲欧美日韩精品| 手机av在线看| 国产精品最新自拍| 国产精品免费久久久| 国产视频在线观看视频| 成人18视频在线播放| 另类视频在线观看+1080p| 午夜视频在线免费观看| 亚洲一区免费观看| 日韩一级片播放| 久久精品免视看国产成人| 亚洲激情视频网站| 变态另类ts人妖一区二区| 欧美aa国产视频| 日韩av电影在线播放| 国产三级第一页| 本田岬高潮一区二区三区| 午夜精品一区二区三区四区| 青青在线视频| 欧美视频一区二区三区四区 | 国产成人1区| 久久久久99精品久久久久| 欧美成人精品欧美一级乱黄| 麻豆91在线播放| 麻豆视频成人| 先锋成人av| 欧美日韩免费高清一区色橹橹| 亚洲欧美高清在线| 色135综合网| 2019中文字幕免费视频| 99久久精品国产色欲| 久久久久一区二区三区四区| 99久久免费观看| 只有精品亚洲| 亚洲色图18p| 日本三级免费看| 精品亚洲欧美一区| 青娱乐国产91| 涩涩视频在线播放| 日韩精品一区二区三区视频播放 | 免费观看成年在线视频网站| 亚洲激情在线激情| 国模私拍视频在线观看| 国产亚洲第一伦理第一区| 欧美黑人巨大xxx极品| 一区二区视频网站| 国产亚洲va综合人人澡精品 | 欧美日韩大片| 亚洲精品国产精品自产a区红杏吧| 18岁成人毛片| 国产麻豆91精品| 正在播放一区| 四虎影视精品永久在线观看| 亚洲最新av在线网站| 岛国av中文字幕| 99精品视频中文字幕| 久操手机在线视频| 欧美综合影院| 色噜噜狠狠狠综合曰曰曰| 国产成人无码专区| 久久精品夜色噜噜亚洲a∨| 欧美成人一区二区在线观看| 狠狠一区二区三区| 国语自产偷拍精品视频偷| 99久久久无码国产精品免费| 国产精品你懂的在线欣赏| 男女啪啪网站视频| 欧美丝袜激情| 国产裸体写真av一区二区| 午夜激情视频在线观看| 欧美体内she精视频| 正在播放国产对白害羞| 蜜臀av性久久久久蜜臀av麻豆| 香蕉久久免费影视| 国外成人福利视频| 日韩一级黄色av| 国产剧情久久久| 一二三四社区欧美黄| 亚洲成av人片在线观看无| 国产一区二区三区久久久久久久久 | 国产模特av私拍大尺度| 亚洲视频精选在线| 日韩高清一二三区| 狠狠色综合网| 精品视频第一区| 希岛爱理一区二区三区av高清| 一本色道久久88精品综合| 亚洲一区二区人妻| 一区二区三区不卡在线观看 | 91在线视频在线| 不卡影院一区二区| 国产精品99久久精品| 91av免费看| 中文不卡1区2区3区| 影音先锋欧美精品| 国产99视频在线| 亚洲va韩国va欧美va精品| 三级男人添奶爽爽爽视频| 日韩成人一区二区三区在线观看| 国产又爽又黄ai换脸| av日韩精品| 国产成人精品在线播放| 国内精品久久久久久野外| 精品国产伦一区二区三区免费| 日产精品久久久| 国产精品成人午夜| 亚洲成年人av| 日韩不卡一二三区| 成人在线国产视频| 精品国产乱码| 粉嫩av免费一区二区三区| 韩国主播福利视频一区二区三区| 日韩在线视频免费观看高清中文| 人妻一区二区三区免费| 欧美吞精做爰啪啪高潮| 日韩av综合在线| 国产精品你懂的| 男男做爰猛烈叫床爽爽小说 | 91精品国自产在线| 国产成人精品免费看| 国产成人精品视频ⅴa片软件竹菊| 亚洲成人精品| 日韩jizzz| 男人的天堂久久| 95av在线视频| 欧美1级2级| 91精品国产91| 欧美伦理免费在线| 深夜福利91大全| 美丽的姑娘在线观看免费动漫| 日韩欧美综合在线| 特级西西444www高清大视频| 性做久久久久久久免费看| 99成人在线观看| 国产三级一区二区| av黄色一级片| 国产成人av电影在线| 欧美大尺度做爰床戏| 免费在线欧美黄色| 日韩av新片网| 欧美日本中文| 日本三日本三级少妇三级66| 青青草成人影院| 欧美综合77777色婷婷| 老司机在线精品视频| 5566av亚洲| 久久久久久亚洲精品美女| 国产精品专区一| 日韩免费小视频| 秋霞午夜一区二区| 麻豆网站免费在线观看| 欧美激情影音先锋| 午夜伦理在线视频| 欧美另类69精品久久久久9999| 在线观看麻豆| 色老头一区二区三区在线观看| 成人在线观看免费| 亚洲天堂av在线免费| 欧美成人片在线| 日韩精品有码在线观看| 视频国产在线观看| 日韩激情片免费| 日漫免费在线观看网站| 日韩电视剧免费观看网站| 蜜桃av噜噜一区二区三区麻豆| 欧美一级淫片007| av男人天堂av| 欧美变态tickle挠乳网站| 丰满人妻妇伦又伦精品国产| 精品女同一区二区| 蜜桃视频久久一区免费观看入口 | 国产精品久久无码| 91蜜桃网址入口| 男生裸体视频网站| 91麻豆免费在线观看| 波多野结衣 在线| 国产三级一区二区三区| 三级影片在线观看| 亚洲视频一区二区在线观看| 极品盗摄国产盗摄合集| 亚洲国产精品自拍| 日韩精品久久久久久免费| 在线视频综合导航| 在线免费观看高清视频| 91精品国产乱| 秋霞视频一区二区| 亚洲欧洲xxxx| 麻豆传媒免费在线观看| 欧美巨乳在线观看| 女厕盗摄一区二区三区| 国产精品欧美一区二区| 国产精品久久久久久久久久辛辛| 成人av资源| 精品国产精品久久一区免费式| 国产精品jizz在线观看老狼| 激情综合久久| 成年网站在线播放| 国产成人精品免费视频网站| 女同毛片一区二区三区| 国产精品美女久久久久久久久久久| 性生交大片免费全黄| 亚洲福利一二三区| 中文有码在线播放| 欧美一区二区视频在线观看2022 | 日韩中文字幕视频在线观看| av中文字幕在线观看| 91福利视频网| 亚洲欧洲二区| 亚洲午夜精品一区| 成人综合专区| 中文字幕の友人北条麻妃| 亚洲国产高清一区二区三区| 日本美女高潮视频| 国产精品系列在线播放| 受虐m奴xxx在线观看| 亚洲欧洲综合另类| 精品免费囯产一区二区三区| 制服丝袜日韩国产| 你懂的在线看| 欧美成人剧情片在线观看| 久久电影tv| 国产伦精品一区二区三区视频孕妇| 欧美美女在线| 18禁裸男晨勃露j毛免费观看| 青青草原综合久久大伊人精品优势| 久久无码专区国产精品s| 99久久精品国产导航| 久草手机视频在线观看| 精品日韩美女的视频高清| 国产乱淫a∨片免费视频| 亚洲免费一在线| 超清av在线| 欧美一区二区三区精品电影| 日韩欧美久久| 亚洲精品影院| 免费亚洲视频| 国产乱了高清露脸对白| 亚洲精品国产一区二区精华液 | 欧美一级爆毛片| 岛国最新视频免费在线观看| 午夜精品三级视频福利| 国产精品免费精品自在线观看| 日本一区二区三区视频在线观看| 亚洲乱码久久| 国产伦精品一区二区三区88av| 亚洲欧美偷拍三级| 亚洲一级视频在线观看| 国产亚洲欧美aaaa| 日韩av大片站长工具| 精品久久久三级| 日韩午夜av在线| 中文字幕天堂网| 亚洲午夜电影网| 亚洲第一天堂影院| 欧美高清视频在线观看| 日韩一区二区三区精品视频第3页| 日韩人妻精品一区二区三区| 激情欧美一区二区三区在线观看| 少妇高潮惨叫久久久久| 欧美日韩一区二区在线观看| 国产黄色片在线播放| 国产成人涩涩涩视频在线观看| 国产精品视频一区二区三区四蜜臂| 精品一区二区中文字幕| 99r国产精品| 久久久久久久久久免费视频| 日韩激情视频在线| 欧美成a人片在线观看久| 欧美日韩高清免费| 久久综合五月| 国产午夜精品久久久久久久久| 欧美亚洲一区二区三区四区| av电影在线播放高清免费观看| 国产免费一区二区三区在线能观看 | 国产成人丝袜美腿| 精品一区在线视频| 亚洲国产精品va| 美女高潮视频在线看| 麻豆91蜜桃| 亚洲免费在线视频观看| 成人在线观看一区| 日本道免费精品一区二区三区| 天堂av中文字幕| 91精品91久久久久久| 免费看av成人| 国产成人手机视频| 国产精品麻豆欧美日韩ww| 91久久精品国产91性色69| 美女性感视频久久久| 九九热播视频在线精品6| av天堂永久资源网| 国产精品女上位| 亚洲va久久久噜噜噜无码久久| 91国产中文字幕| heyzo久久| 日本高清免费在线视频| 亚洲成人激情综合网| 伦理片一区二区三区| 成人性生交大片免费看视频直播| 欧美日韩一区二区高清| 最新版天堂资源在线| 欧美性一区二区| 黑人另类精品××××性爽| 欧美日韩亚洲免费| 精品午夜久久福利影院| 日本污视频在线观看| 中文字幕亚洲综合久久| 99re8这里有精品热视频8在线| 北条麻妃视频在线| 亚洲色图另类专区| 四虎影视在线播放| 成人欧美一区二区三区黑人| 亚洲精品韩国| 国产3级在线观看| 日韩精品高清在线观看| 激情不卡一区二区三区视频在线| 国产素人在线观看| 亚洲欧洲日产国产综合网| 日韩欧美在线观看一区二区|