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

如何在Spring Webflux中實現雙因素認證

譯文
安全 數據安全
在本文中,我將和您討論如何在Spring Webflux中通過REST API實現雙因素認證。

【51CTO.com快譯】目前,在大多情況下,尤其是對于企業級應用、或處理敏感數據的應用(如:財務應用)場景中,多因素身份認證(Multi-factor authentication,MFA)已成為了最常見的處理方法。此外,MFA也被相關法律要求在越來越多的行業中是強制執行(尤其是在歐盟)。因此,如果您正在開發應用程序,那么大概率會以某種形式啟用雙(或多)因素身份認證。

在本文中,我將向您展示如何為使用Spring Webflux,來構建的響應式API,以實現兩因素身份認證。該應用主要使用電子郵件和密碼對作為第一安全因素,并采用用戶設備上應用程序(如:Google Authenticator)所生成的一次性代碼(TOTP)作為第二安全因素。

兩因素身份認證是如何工作的

從技術上講,兩(或多)因素身份認證是一個安全過程,用戶必須提供兩個或更多安全因素來讓自己得到認證。也就是說,用戶需要提供除密碼以外的另一個標識符,例如:一次性密碼、硬件令牌、生物特征(如:指紋)等。

該安全過程涉及到如下步驟:

  • 用戶輸入電子郵件(用戶名)和密碼。
  • 除了第一憑據,用戶還要提交由認證應用生成的一次性代碼。
  • 應用程序在對電子郵件(用戶名)和密碼進行身份認證的同時,也使用在注冊過程中頒發的用戶密鑰來認證一次性代碼

由此可見,與使用短信傳遞口令代碼相比,使用諸如Google Authenticator、Microsoft Authenticator、以及FreeOTP等身份認證應用,既能夠避免SIM卡遭受攻擊(請參見--

https://www.theverge.com/2017/6/17/15772142/how-to-set-up-two-factor-authentication),又能夠無需蜂窩網絡或互聯網連接,進行正常認證。

應用示例

下面,我們將逐步構建一個使用兩因素身份認證技術的簡單REST API。該API要求用戶提供電子郵件密碼對,和由應用生成的短代碼。在此,我使用Android版的Google Authenticator來生成TOTP。其源代碼的github庫鏈接為--

https://github.com/mednikoviurii/spring-twofactor-example。該應用會用到JDK 11、Maven、以及用于存儲用戶個人信息的MongoDB。其項目組織結構如下圖所示:

應用示例的項目結構

在此,我不會遍歷地介紹每一個組成部分,而只會專注于AuthService、TokenManager和TotpManager。這些部分主要負責身份的認證流程。它們分別提供了以下功能:

  • AuthService –該組件主要用于存儲、認證和授權所有的業務邏輯,其中包括:注冊、登錄和令牌認證。
  • TokenManager–該組件通過抽象代碼,以生成和認證JWT令牌。它能夠使得主要業務邏輯的實現與具體的JWT庫相互獨立。在此,我使用是Nimbus JOSE-JWT(請參見--https://connect2id.com/products/nimbus-jose-jwt/examples)。
  • TotpManager–作為另一種抽象,它能夠將實現與基本邏輯相隔離。TotpManager既可被用于生成用戶的密鑰,又可以斷言(assert,可以立即為驗證)給出的短代碼。在此,我使用的是TOTP Java庫(https://github.com/samdjstevens/java-totp)來實現,當然您也可以選用其他的庫。

由于在此僅關注認證組件,因此我們將從用戶的創建過程(注冊)開始,同時涉及到密鑰的生成和令牌的頒發。接著,我們將進入登錄流程,涉及一個由用戶提供的短代碼的斷言。

實現注冊流程

下面,我們將完成一個注冊的過程,其中涉及以下步驟:

  • 從客戶端獲取注冊請求。
  • 檢查該用戶是否存在。
  • 對密碼進行哈希。
  • 生成一個密鑰。
  • 將用戶存儲到數據庫中。
  • 頒發JWT。
  • 返回帶有用戶ID、私鑰和令牌的響應。

我將主要的業務邏輯(AuthServiceImpl)與令牌的生成,以及密鑰的產生分離開來。

一般步驟

主要組件AuthServiceImpl會接受SignupRequest,并返回SignupResponse。在后臺,它負責整個注冊的邏輯。下面是具體的實現代碼:

Java

  1. 1.  @Override 
  2. 2.  public Mono<SignupResponse> signup(SignupRequest request) { 
  3. 3.  // generating a new user entity params 
  4. 4.  // step 1 
  5. 5.  String email = request.getEmail().trim().toLowerCase(); 
  6. 6.  String password = request.getPassword(); 
  7. 7.  String salt = BCrypt.gensalt(); 
  8. 8.  String hash = BCrypt.hashpw(password, salt); 
  9. 9.  String secret = totpManager.generateSecret(); 
  10. 10. User user = new User(null, email, hash, salt, secret); 
  11. 11. // preparing a Mono 
  12. 12. Mono<SignupResponse> response = repository.findByEmail(email) 
  13. 13.         .defaultIfEmpty(user) // step 2 
  14. 14.         .flatMap(result -> { 
  15. 15.             // assert, that user does not exist 
  16. 16.             // step 3 
  17. 17.             if (result.getUserId() == null) { 
  18. 18.                 // step 4 
  19. 19.                 return repository.save(result).flatMap(result2 -> { 
  20. 20.                     // prepare token 
  21. 21.                     // step 5 
  22. 22.                     String userId = result2.getUserId(); 
  23. 23.                     String token = tokenManager.issueToken(userId); 
  24. 24.                     SignupResponse signupResponse = new SignupResponse(); 
  25. 25.                     signupResponse.setUserId(userId); 
  26. 26.                     signupResponse.setSecretKey(secret); 
  27. 27.                     signupResponse.setToken(token); 
  28. 28.                     signupResponse.setSuccess(true); 
  29. 29.                    
  30. 30.                     return Mono.just(signupResponse); 
  31. 31.                 }); 
  32. 32.             } else { 
  33. 33.                 // step 6 
  34. 34.                 // scenario - user already exists 
  35. 35.                 SignupResponse signupResponse = new SignupResponse(); 
  36. 36.                 signupResponse.setSuccess(false); 
  37. 37.                
  38. 38.                 return Mono.just(signupResponse); 
  39. 39.             } 
  40. 40.         }); 
  41. 41. return response; 

下面,讓我們逐步解讀上述實現的過程。在邏輯判讀中:如果當前用戶是新用戶,我們將對其進行注冊;如果該用戶已經存在于數據庫之中,那么我們就必須拒絕該請求。具體步驟為:

  • 我們根據請求數據創建一個新的用戶實體,并生成一個相應的密鑰。
  • 如果該用戶過去不存在,則將給出的新實體作為其默認實體。
  • 檢查存儲庫的調用結果。
  • 將用戶保存在數據庫中,并獲取其userId。
  • 頒發JWT。
  • 如果用戶已經存在,則返回一個拒絕響應。

相比以漏洞和安全問題而聞名的SHA函數,我在此選用jBcrypt庫(請參見-- https://www.mindrot.org/projects/jBCrypt/),來產生各種安全的哈希和salt(鹽)。如不你不太熟悉jBcrypt的話,請參見教程--

https://dzone.com/articles/password-encryption-and-decryption-using-bcrypt,以獲取更多信息。

生成密鑰

接下來,我們需要實現一個用來生成新的密鑰的函數。它是由TotpManager.generateSecret()內部抽象而來。下面是它的代碼:

Java:

  1. 1.  @Override 
  2. 2.  public String generateSecret() { 
  3. 3.    SecretGenerator generator = new DefaultSecretGenerator(); 
  4. 4.    return generator.generate(); 
  5. 5.  } 

測試

實現了注冊邏輯之后,我們需要測試它是否能夠按預期進行認證。首先,讓我們調用signup端點以創建一個新的用戶。其結果對象應當包含我們需要添加到應用生成器(如:Google Authenticator)的userId、令牌和密鑰:

成功注冊

不過,我們應當禁止同一封電子郵件兩次進行注冊。在此,我們通過斷言,以保證應用在創建新用戶之前,去檢查現有的電子郵件列表:

登錄響應對象

登錄

下面,我們來討論登錄流程。該流程包括兩個主要部分:認證電子郵件的密碼憑據,以及認證由用戶提供的一次性代碼。和上一節一樣,我們首先介紹登錄所涉及的步驟:

  • 從客戶端獲取登錄請求。
  • 在數據庫中找到該用戶。
  • 使用請求中提供的密碼進行斷言。
  • 斷言一次性代碼。
  • 返回帶有令牌的登錄響應。

而JWT的生成過程與注冊的過程比較類似。

一般步驟

作為該示例的功能重點,AuthServiceImpl.login將實現主要的業務邏輯。首先,我們需要通過在數據庫中請求電子郵件,來查找用戶;否則,我們需要提供帶有空字段的默認值。也就是說,讓user.getUserId() == null,以表示該用戶并不存在,登錄流程隨即中止。

接著,我們需要斷言密碼的匹配。當我們將密碼的哈希值存儲在數據庫中時,就需要使用存儲的salt對請求中的密碼進行哈希處理,進而斷言這兩個值。

如果密碼匹配,我們需要使用之前存儲的密鑰值來認證提交的代碼。認證成功與否的結果,將在產生JWT和創建LoginResponse對象后得出。以下便是此部分的最終源代碼:

Java

  1. 1.  @Override 
  2. 2.  public Mono<LoginResponse> login(LoginRequest request) { 
  3. 3.    String email = request.getEmail().trim().toLowerCase(); 
  4. 4.    String password = request.getPassword(); 
  5. 5.    String code = request.getCode(); 
  6. 6.    Mono<LoginResponse> response = repository.findByEmail(email) 
  7. 7.    // step 1 
  8. 8.            .defaultIfEmpty(new User()) 
  9. 9.            .flatMap(user -> { 
  10. 10.               // step 2 
  11. 11.               if (user.getUserId() == null) { 
  12. 12.                   // no user 
  13. 13.                   LoginResponse loginResponse = new LoginResponse(); 
  14. 14.                   loginResponse.setSuccess(false); 
  15. 15.                  
  16. 16.                   return Mono.just(loginResponse); 
  17. 17.               } else { 
  18. 18.                   // step 3 
  19. 19.                   // user exists 
  20. 20.                   String salt = user.getSalt(); 
  21. 21.                   String secret = user.getSecretKey(); 
  22. 22.                   boolean passwordMatch = BCrypt.hashpw(password, salt).equalsIgnoreCase(user.getHash()); 
  23. 23.                  if (passwordMatch) { 
  24. 24.                      // step 4 
  25. 25.                      // password matched 
  26. 26.                      boolean codeMatched = totpManager.validateCode(code, secret); 
  27. 27.                      if (codeMatched) { 
  28. 28.                          // step 5 
  29. 29.                          String token = tokenManager.issueToken(user.getUserId()); 
  30. 30.                          LoginResponse loginResponse = new LoginResponse(); 
  31. 31.                          loginResponse.setSuccess(true); 
  32. 32.                          loginResponse.setToken(token); 
  33. 33.                          loginResponse.setUserId(user.getUserId()); 
  34. 34.                         
  35. 35.                          return Mono.just(loginResponse); 
  36. 36.                      } else { 
  37. 37.                          LoginResponse loginResponse = new LoginResponse(); 
  38. 38.                          loginResponse.setSuccess(false); 
  39. 39.                          return Mono.just(loginResponse); 
  40. 40.                      } 
  41. 41.                  } else { 
  42. 42.                      LoginResponse loginResponse = new LoginResponse(); 
  43. 43.                      loginResponse.setSuccess(false); 
  44. 44.                     
  45. 45.                      return Mono.just(loginResponse); 
  46. 46.                  } 
  47. 47.              } 
  48. 48.          }); 
  49. 49.  return response; 
  50. 50. } 

可見,后臺的邏輯步驟為:

  • 提供具有空字段的默認用戶實體。
  • 檢查該用戶是否確實存在。
  • 從請求和salt處生成密碼的哈希,并存儲在數據庫中。
  • 斷言密鑰是否能夠確實匹配。
  • 認證一次性代碼,并頒發JWT。

斷言一次性代碼

為了認證由應用生成的一次性代碼,我們必須向TOTP庫提供相應的代碼和密鑰,并將它們保存為用戶實體的一部分。具體代碼如下:

Java

  1. 1.  @Override 
  2. 2.  public boolean validateCode(String code, String secret) { 
  3. 3.    TimeProvider timeProvider = new SystemTimeProvider(); 
  4. 4.    CodeGenerator codeGenerator = new DefaultCodeGenerator(); 
  5. 5.    CodeVerifier verifier = new DefaultCodeVerifier(codeGenerator, timeProvider); 
  6. 6.    return verifier.isValidCode(secret, code); 
  7. 7.  } 

測試

最后,我們可以通過測試,以認證登錄的過程是否如期運行。我們將由Google Authenticator生成的代碼作為登錄請求的負載,去調用login端點。

如下圖所示,為了檢查處密碼錯誤的情況,我們需要將進程終止在密碼斷言階段:

由于密碼錯誤,登錄被拒絕

至此,我們已經創建了一個簡單的REST API,它可以通過Spring Webflux(請參見--

https://www.mednikov.tech/two-factor-authentication-for-spring-webflux-apis/)的TOTP來提供兩因素身份認證。如前文所述,為了更專注于身份認證的邏輯,我們省略了所有的其他部分。

如果您對該示例的完整代碼感興趣,請參見--https://github.com/mednikoviurii/spring-twofactor-example。

參考文獻

  • Dhiraj Ray的《使用jBCrypt實現密鑰的加、解密》(2017)--https://dzone.com/articles/password-encryption-and-decryption-using-bcrypt。
  • Sanjay Patel的《如何在Spring應用中使用Nimbus JOSE和JWT》Natural Programmer Blog(2018)--https://www.naturalprogrammer.com/blog/17852/spring-framework-nimbus-jose-jwt。
  • Scott Brady的《使用Nimbus JOSE和JWT創建帶有簽名的JWT》(2019)--https://www.scottbrady91.com/Kotlin/Creating-Signed-JWTs-using-Nimbus-JOSE-JWT。

原標題:Two-Factor Authentication in Spring Webflux REST API ,作者:Yuri Mednikov

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

責任編輯:趙寧寧 來源: 51CTO
相關推薦

2022-08-01 00:08:03

雙因素認證2FA

2024-10-17 11:24:04

2020-09-30 11:22:16

帳戶安全

2016-10-12 15:11:56

2017-01-19 10:47:46

公有云云計算MFA

2022-03-17 08:17:45

SpringGemFire緩存數據

2011-08-15 09:31:55

2016-01-15 10:58:02

2020-04-27 09:00:00

雙因素認證身份認證生物識別

2013-05-23 18:03:25

2024-01-05 15:10:29

2010-04-20 10:00:29

2015-03-12 13:44:44

DKEY雙因素認證寧盾

2015-03-09 11:20:25

雙因素認證寧盾DKEY

2015-03-02 14:48:07

2020-07-07 07:00:00

Spring WebFREST APIReactive AP

2013-03-15 14:47:13

YubiKeyUSB密鑰雙因素驗證

2022-07-08 07:02:10

Python動態碼OTP

2022-07-04 09:15:10

Spring請求處理流程

2023-02-09 08:01:12

核心組件非阻塞
點贊
收藏

51CTO技術棧公眾號

暴力调教一区二区三区| 在线观看亚洲| 欧美日韩三级在线| 国产又粗又爽又黄的视频| 精品人妻伦一二三区久久| 日韩亚洲国产精品| 日韩中文字幕第一页| 久久久久久久久久一区| 超碰99在线| 国产精品久久影院| 精品久久一区二区三区蜜桃| 一级特黄免费视频| 韩国亚洲精品| 中文字幕日韩欧美在线| 欧美夫妇交换xxx| 99亚洲伊人久久精品影院| 亚洲一区二区成人在线观看| 日本高清久久一区二区三区| 草草视频在线播放| 久久精品国产一区二区| 97视频免费观看| 国产日韩欧美在线观看视频| 综合国产视频| 亚洲国产精彩中文乱码av在线播放| 日本熟妇人妻中出| 国产丝袜在线观看视频| 中文字幕成人在线观看| 精品无人区一区二区三区| 国产日韩精品suv| 日韩福利电影在线| 欧美中文字幕第一页| a级黄色片免费看| 波多野结衣的一区二区三区 | 欧美性猛交久久久乱大交小说| dy888亚洲精品一区二区三区| 国产日韩综合av| 狠狠色伊人亚洲综合网站色| 国产suv一区二区| 九九国产精品视频| 国产精品视频精品视频| 少妇太紧太爽又黄又硬又爽| 国产精品啊啊啊| 久久影院资源网| 影音先锋男人资源在线观看| 极品美女一区二区三区| 亚洲裸体xxxx| 国产精品无码一区二区三区免费 | 一级片一级片一级片| 欧美精品色图| 亚洲色图国产精品| 97伦伦午夜电影理伦片| 美女网站色精品尤物极品姐弟| 日韩三级免费观看| 日本黄色三级网站| 日本在线视频一区二区三区| 欧美一区三区二区| 久久精品一二三四| 精品国产亚洲一区二区三区在线| 欧美日韩1区2区| 污污网站在线观看视频| 91精品国产一区二区在线观看| 欧美午夜电影在线播放| gogogo高清免费观看在线视频| 国产一区二区主播在线| 欧美日韩高清一区二区不卡| 天天干天天玩天天操| 在线高清欧美| 日韩欧美一二三| 中文视频在线观看| 神马久久影院| 亚洲图片欧美日产| 麻豆一区在线观看| 欧美日韩一卡| 97av视频在线| 极品国产91在线网站| 天堂av在线一区| 国产欧美精品在线播放| 91资源在线视频| 高清成人免费视频| 久久久久久九九九九| 国产污视频在线| 日韩码欧中文字| 国产免费黄色一级片| 手机在线观看av网站| 欧美亚洲丝袜传媒另类| 男人午夜视频在线观看| 国产精品久久久网站| 国产一区二区三区久久精品| 久久久久久视频| 在线亚洲免费| 成人免费网站在线| 天堂网av2014| 国产精品久久国产精麻豆99网站| 国产成a人亚洲精v品在线观看| 鲁鲁在线中文| 欧美妇女性影城| 中文字幕在线播放一区| 久久性感美女视频| 久久久久久久影院| 最新中文字幕第一页| 国产成人在线免费| 日韩欧美亚洲在线| 欧美videos另类精品| 91成人免费在线| 亚洲成人精品在线播放| 精品产国自在拍| 欧美国产日韩免费| 中国黄色一级视频| 不卡免费追剧大全电视剧网站| 亚洲国产成人不卡| 国产粉嫩在线观看| 欧美一区午夜视频在线观看| av网在线播放| 夜夜夜久久久| 97人人干人人| 在线看的av网站| 欧美午夜激情在线| 亚洲av无一区二区三区久久| blacked蜜桃精品一区| 久久久噜噜噜久久中文字免| 一级特黄录像免费看| 91理论电影在线观看| 国产成人艳妇aa视频在线 | 日韩一区二区三区色 | www.看毛片| 国产午夜精品福利| 少妇人妻无码专区视频| 成人51免费| 在线电影av不卡网址| 日韩伦人妻无码| 国产久卡久卡久卡久卡视频精品| 日本在线播放一区| 日韩电影毛片| 欧美zozozo| 黄视频网站免费看| 久久精品国产一区二区三区免费看 | 亚洲成人激情社区| 日韩av在线一区| 国产一级大片在线观看| 国产一区二区免费视频| av动漫免费观看| 欧美大片1688网站| 亚洲天堂av在线免费| 免费看毛片网站| 91亚洲国产成人精品一区二三| www.日本三级| 8x国产一区二区三区精品推荐| 久久久国产成人精品| 艳妇乳肉豪妇荡乳av| 中文字幕不卡在线播放| 无码内射中文字幕岛国片| 最近国产精品视频| 青草青草久热精品视频在线网站 | 久久久久久电影| 欧美日韩在线不卡视频| 青青久久av| 国产va免费精品高清在线观看| 人成在线免费视频| 91久久国产最好的精华液| 久久精品—区二区三区舞蹈| 日韩影院免费视频| 色一情一区二区三区四区| 国产成人77亚洲精品www| 在线电影欧美日韩一区二区私密| 国产主播第一页| 国产精品素人一区二区| 午夜免费福利视频在线观看| 亚洲精品2区| 国产精品日韩二区| 欧美亚洲韩国| 丝袜亚洲另类欧美重口| av中文字幕免费在线观看| 亚洲在线免费播放| 黄色正能量网站| 轻轻草成人在线| 日韩不卡视频一区二区| 国产精品久久久久av蜜臀| 97av在线视频| 秋霞午夜在线观看| 精品久久久三级丝袜| 欧美一区二区激情视频| 国产精品久久毛片av大全日韩| 蜜桃福利午夜精品一区| 亚洲黄色精品| 亚洲欧美久久234| 成人资源在线| 国产精品扒开腿做| 污污影院在线观看| 亚洲美女性视频| 国产精品一区二区人人爽| 亚洲一区电影777| 91激情视频在线观看| 韩国一区二区在线观看| 国产97在线 | 亚洲| 日韩欧美一区免费| 国产精品一区二区欧美黑人喷潮水| 电影一区二区三| 免费91在线视频| 欧美日韩影视| 日韩欧美一级在线播放| 伦av综合一区| 亚洲黄一区二区三区| 草草影院第一页| 国产盗摄女厕一区二区三区| 亚洲爆乳无码专区| 国精品一区二区| 五月婷婷一区| 日韩三级毛片| 99国产超薄肉色丝袜交足的后果| 日韩精品免费观看视频| 久久久久久国产免费| 日本在线视频观看| 亚洲美女视频网站| 色一情一乱一乱一区91av| 欧美区在线观看| 亚洲av无码精品一区二区| 亚洲综合无码一区二区| 任我爽在线视频| 国产午夜亚洲精品羞羞网站| 污污内射在线观看一区二区少妇 | 欧美特黄a级高清免费大片a级| 日韩高清av电影| 婷婷精品在线| 精品久久久久久乱码天堂| 蜜桃在线一区| 成人福利网站在线观看| 精品3atv在线视频| 日韩免费av片在线观看| av剧情在线观看| 久久久久久久香蕉网| 中文字幕有码在线视频| 久久影视电视剧免费网站| 日本电影在线观看网站| 亚洲一品av免费观看| 欧美日韩影视| 亚洲美女av在线播放| 亚洲欧美日韩动漫| 亚洲国内精品在线| 手机在线不卡av| 亚洲国产成人爱av在线播放| 国精产品一品二品国精品69xx| 欧美一级在线视频| h片在线免费看| 日韩精品一区二区三区swag| 草逼视频免费看| 日韩精品资源二区在线| 国产免费久久久| 91精品麻豆日日躁夜夜躁| 国产精品无码久久av| 91麻豆精品国产91久久久使用方法| 怡红院成永久免费人全部视频| 欧美综合亚洲图片综合区| 337p粉嫩色噜噜噜大肥臀| 色综合欧美在线视频区| 一级一片免费看| 欧美影视一区在线| 亚洲专区第一页| 欧美美女激情18p| 精品久久久免费视频| 精品蜜桃在线看| 姝姝窝人体www聚色窝| 日韩精品视频在线免费观看| 三级黄视频在线观看| 亚洲色图25p| 欧美18hd| 欧美激情视频在线| 日韩脚交footjobhd| 日韩美女在线观看| 国产美女亚洲精品7777| www日韩av| 外国成人在线视频| 日韩欧美在线电影| 欧美一区精品| 免费看国产曰批40分钟| 丝袜亚洲精品中文字幕一区| 在线观看免费污视频| 国产精品99久久久久久似苏梦涵| www.四虎精品| 久久久久99精品一区| 日本爱爱小视频| 亚洲成va人在线观看| 欧美超碰在线观看| 日韩一区二区在线观看| 亚洲aaaaaaa| 日韩亚洲欧美成人| av中文在线资源| 国产精品一区av| 粉嫩的18在线观看极品精品| 日本在线免费观看一区| 你懂的国产精品| 无码人妻h动漫| 激情五月婷婷综合| 国产高清自拍视频| 亚洲人xxxx| 精品黑人一区二区三区| 欧美一区二区三区四区久久| 亚洲三级中文字幕| 伦理中文字幕亚洲| 美女福利一区二区 | 久久免费视频66| 亚洲国产精品毛片| 最新亚洲一区| www.99r| 久久久综合激的五月天| 国产这里有精品| 欧美在线视频日韩| 三级网站在线看| 成人97在线观看视频| 日本精品在线一区| 国产日韩欧美二区| 亚洲国产一区二区三区在线播放| 日韩精品一区中文字幕| 成人黄色一级视频| 午夜精品福利在线视频| 91久久精品一区二区三区| 免费a级片在线观看| 久久精品国产视频| 日本精品裸体写真集在线观看| 国产伦精品一区二区三| 亚洲成人一区| 久久久久久蜜桃一区二区| 久久婷婷国产综合精品青草| 国产亚洲成人av| 欧美一区二区三区啪啪| av资源种子在线观看| 欧洲亚洲免费视频| 欧美日韩一本| 国产美女在线一区| 国产成人亚洲综合a∨猫咪| 日本猛少妇色xxxxx免费网站| 一本久久a久久免费精品不卡| 丰满少妇在线观看bd| 九九九久久国产免费| 国产一区一区| 正在播放国产精品| 老汉av免费一区二区三区| 乐播av一区二区三区| 91精品1区2区| 国产在线视频网站| 国产成人综合亚洲| 精品大片一区二区| 高清一区在线观看| 欧美国产视频在线| 国产精品视频一区二区三| 7777精品伊人久久久大香线蕉的| 中文字幕在线视频区| 国产精品久久久久久久久粉嫩av | 亚洲性生活视频| 欧美黑人一区| 先锋影音一区二区三区| 青青草91视频| 国产探花在线视频| 欧美一级国产精品| 丁香花在线高清完整版视频| 国产精品免费在线| 午夜一区不卡| 少妇真人直播免费视频| 色婷婷av一区二区三区大白胸| 免费国产在线观看| 国产精品丝袜视频| 91精品天堂福利在线观看| 992kp免费看片| 亚洲成人1区2区| 黄色毛片在线观看| 国产精品一区电影| 一区二区三区国产精华| 日本少妇一区二区三区| 午夜精品久久久久久不卡8050| 免费黄色在线视频网站| 91精品久久久久久久久不口人| 亚洲第一偷拍| 强迫凌虐淫辱の牝奴在线观看| 色综合婷婷久久| 人人干在线视频| 国内精品二区| 日本美女一区二区三区视频| 亚洲天堂黄色片| 亚洲精品久久久久| 欧美激情啪啪| 男人的天堂狠狠干| 中文一区一区三区高中清不卡| 国产精品高潮呻吟AV无码| 97人人做人人爱| 91综合在线| 久久无码人妻精品一区二区三区| 欧美在线影院一区二区| sm国产在线调教视频| 久久另类ts人妖一区二区| 久久99精品国产麻豆不卡| 国产精品变态另类虐交| 在线观看视频99| 精品亚洲精品| 欧美一级xxxx| 欧美日韩黄色大片| 精品国产99久久久久久| 精品一区二区三区国产| 韩国一区二区三区| 国产又粗又猛又爽又| 欧美激情视频一区| 日韩成人a**站|