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

實戰:畫了幾張圖,終于把OAuth2搞清楚了

開發 前端
本文從原理、應用場景、認證流程出發,對oauth2進行了基本的講解,并且手把手帶大家完成了項目的搭建。大家在對授權碼模式、簡化模式、密碼模式、客戶端模式進行測試的同時要將重點放到授權碼模式上。

理論

OAuth?是一個關于授權(authorization)的開放網絡標準,用來授權第三方應用獲取用戶數據,是目前最流行的授權機制,它當前的版本是2.0。

應用場景

假如你正在“網站A”上沖浪,看到一篇帖子表示非常喜歡,當你情不自禁的想要點贊時,它會提示你進行登錄操作。

圖片

打開登錄頁面你會發現,除了最簡單的賬戶密碼登錄外,還為我們提供了微博、微信、QQ等快捷登錄方式。假設選擇了快捷登錄,它會提示我們掃碼或者輸入賬號密碼進行登錄。

圖片

登錄成功之后便會將QQ/微信的昵稱和頭像等信息回填到“網站A”中,此時你就可以進行點贊操作了。

名詞定義

在詳細講解oauth2之前,我們先來了解一下它里邊用到的名詞定義吧:

Client:客戶端,它本身不會存儲用戶快捷登錄的賬號和密碼,只是通過資源擁有者的授權去請求資源服務器的資源,即例子中的網站A;

Resource Owner:資源擁有者,通常是用戶,即例子中擁有QQ/微信賬號的用戶;

Authorization Server:認證服務器,可以提供身份認證和用戶授權的服務器,即給客戶端頒發token和校驗token;

Resource Server:資源服務器,存儲用戶資源的服務器,即例子中的QQ/微信存儲的用戶信息;

認證流程

圖片

如圖是oauth2官網的認證流程圖,我們來分析一下:

  • A客戶端向資源擁有者發送授權申請;
  • B資源擁有者同意客戶端的授權,返回授權碼;
  • C客戶端使用授權碼向認證服務器申請令牌token;
  • D認證服務器對客戶端進行身份校驗,認證通過后發放令牌;
  • E客戶端拿著認證服務器頒發的令牌去資源服務器請求資源;
  • F資源服務器校驗令牌的有效性,返回給客戶端資源信息;

為了大家更好的理解,阿Q特地畫了一張圖:

圖片

到這兒,相信大家對理論知識已經掌握的差不多了,接下來我們就進入實戰訓練吧。

實戰

在正式開始搭建項目之前我們先來做一些準備工作:要想使用oauth2的服務,我們得先創建幾張表。

數據庫

oauth2相關的建表語句可以參考官方初始化sql,也可以查看阿Q項目中的init.sql文件,回復“oauth2”獲取源碼。

圖片

至于表結構,大家可以先大體了解下,其中字段的含義,在init.sql文件中阿Q已經做了說明。

  • oauth_client_details:存儲客戶端的配置信息,操作該表的類主要是JdbcClientDetailsService.java;
  • oauth_access_token:存儲生成的令牌信息,操作該表的類主要是JdbcTokenStore.java;
  • oauth_client_token:在客戶端系統中存儲從服務端獲取的令牌數據,操作該表的類主要是JdbcClientDetailsService.java;
  • oauth_code:存儲授權碼信息與認證信息,即只有grant_type?為authorization_code?時,該表才會有數據,操作該表的類主要是JdbcAuthorizationCodeServices.java;
  • oauth_approvals:存儲用戶的授權信息;
  • oauth_refresh_token:存儲刷新令牌的refresh_token?,如果客戶端的grant_type?不支持refresh_token?,那么不會用到這張表,操作該表的類主要是JdbcTokenStore;

在oauth_client_details表中添加一條數據

client_id:cheetah_one //客戶端名稱,必須唯一
resource_ids:product_api //客戶端所能訪問的資源id集合,多個資源時用逗號(,)分隔
client_secret:$2a$10$h/TmLPvXozJJHXDyJEN22ensJgaciomfpOc9js9OonwWIdAnRQeoi //客戶端的訪問密碼
scope:read,write //客戶端申請的權限范圍,可選值包括read,write,trust。若有多個權限范圍用逗號(,)分隔
authorized_grant_types:client_credentials,implicit,authorization_code,refresh_token,password //指定客戶端支持的grant_type,可選值包括authorization_code,password,refresh_token,implicit,client_credentials, 若支持多個grant_type用逗號(,)分隔
web_server_redirect_uri:http://www.baidu.com //客戶端的重定向URI,可為空, 當grant_type為authorization_code或implicit時, 在Oauth的流程中會使用并檢查與注冊時填寫的redirect_uri是否一致
access_token_validity:43200 //設定客戶端的access_token的有效時間值(單位:),可選, 若不設定值則使用默認的有效時間值(60 * 60 * 12, 12小時)
autoapprove:false //設置用戶是否自動Approval操作, 默認值為 'false', 可選值包括 'true','false', 'read','write'

數據庫中對密碼進行了加密處理,大家可以在此路徑下自行生成

圖片

用戶角色相關的表也在init.sql文件中,表結構非常簡單,大家自行查閱。我的初始化數據為

圖片

依賴引入

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
</dependency>

至于其它依賴,大家可以根據需要自行引入,不再贅述,回復“oauth2”獲取源碼。

資源服務

配置文件對服務端口、應用名稱、數據庫、mybatis和日志進行了配置。

寫了一個簡單的控制層代碼,用來模擬資源訪問

@RestController
@RequestMapping("/product")
public class ProductController {

@GetMapping("/findAll")
public String findAll(){
return "產品列表查詢成功";
}
}

接著創建配置類繼承ResourceServerConfigurerAdapter并增加@EnableResourceServer注解開啟資源服務,重寫兩個configure方法

/**
* 指定token的持久化策略
* InMemoryTokenStore 表示將token存儲在內存中
* RedisTokenStore 表示將token存儲在redis中
* JdbcTokenStore 表示將token存儲在數據庫中
* @return
*/
@Bean
public TokenStore jdbcTokenStore(){
return new JdbcTokenStore(dataSource);
}

/**
* 指定當前資源的id和token的存儲策略
* @param resources
* @throws Exception
*/
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
//此處的id可以寫在配置文件中,這里我們先寫死
resources.resourceId("product_api").tokenStore(jdbcTokenStore());
}


/**
* 設置請求權限和header處理
* @param http
* @throws Exception
*/
@Override
public void configure(HttpSecurity http) throws Exception {
//固定寫法
http.authorizeRequests()
//指定不同請求方式訪問資源所需的權限,一般查詢是read,其余都是write
.antMatchers(HttpMethod.GET,"/**").access("#oauth2.hasScope('read')")
.antMatchers(HttpMethod.POST,"/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.PATCH,"/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.PUT,"/**").access("#oauth2.hasScope('write')")
.antMatchers(HttpMethod.DELETE,"/**").access("#oauth2.hasScope('write')")
.and()
.headers().addHeaderWriter((request,response) -> {
//域名不同或者子域名不一樣并且是ajax請求就會出現跨域問題
//允許跨域
response.addHeader("Access-Control-Allow-Origin","*");
//跨域中會出現預檢請求,如果不能通過,則真正請求也不會發出
//如果是跨域的預檢請求,則原封不動向下傳遞請求頭信息,否則預檢請求會丟失請求頭信息(主要是token信息)
if(request.getMethod().equals("OPTIONS")){
response.setHeader("Access-Control-Allow-Methods",request.getHeader("Access-Control-Allow-Methods"));
response.setHeader("Access-Control-Allow-Headers",request.getHeader("Access-Control-Allow-Headers"));
}
});
}

當然我們也可以配置忽略校驗的??url??,在上邊的??public void configure(HttpSecurity http) throws Exception??中進行配置

ExpressionUrlAuthorizationConfigurer<HttpSecurity>
.ExpressionInterceptUrlRegistry config = http.requestMatchers().anyRequest()
.and()
.authorizeRequests();
properties.getUrls().forEach(e -> {
config.antMatchers(e).permitAll();
});

因為我們是需要進行校驗的,所以我把對應的代碼給注釋掉了,大家可以回復“oauth2”下載源碼自行查看。

然后將實現了UserDetails?的SysUser?和實現了GrantedAuthority?的SysRole?放到項目中,當請求發過來時,oauth2會幫我們自行校驗。

認證服務

配置文件對服務端口、應用名稱、數據庫、mybatis和日志進行了配置。

Security配置

還是和之前Security+JWT組合拳的配置大同小異,不了解的可以先看下該文。

①將繼承了UserDetailsService?的ISysUserService?的實現類SysUserServiceImpl?重寫loadUserByUsername方法

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return this.baseMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username));
}

②繼承WebSecurityConfigurerAdapter?類,增加@EnableWebSecurity注解并重寫方法

/**
* 指定認證對象的來源和加密方式
* @param auth
* @throws Exception
*/
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
}

/**
* 安全攔截機制(最重要)
* @param httpSecurity
* @throws Exception
*/
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
//CSRF禁用,因為不使用session
.csrf().disable()
.authorizeRequests()
//登錄接口和靜態資源不需要認證
.antMatchers("/login*","/css/*").permitAll()
//除上面的所有請求全部需要認證通過才能訪問
.anyRequest().authenticated()
//返回HttpSecurity以進行進一步的自定義,證明是一次新的配置的開始
.and()
.formLogin()
//如果未指定此頁面,則會跳轉到默認頁面
// .loginPage("/login.html")
.loginProcessingUrl("/login")
.permitAll()
//認證失敗處理類
.failureHandler(customAuthenticationFailureHandler);
}

/**
* AuthenticationManager 對象在OAuth2.0認證服務中要使用,提前放入IOC容器中
* @return
* @throws Exception
*/
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

?Au?thorizationServer配置

①繼承AuthorizationServerConfigurerAdapter類,增加@EnableAuthorizationServer注解開啟認證服務

②依賴注入,注入7個實例Bean對象

/**
* 數據庫連接池對象
*/
private final DataSource dataSource;

/**
* 認證業務對象
*/
private final ISysUserService userService;

/**
* 授權碼模式專用對象
*/
private final AuthenticationManager authenticationManager;

/**
* 客戶端信息來源
* @return
*/
@Bean
public JdbcClientDetailsService jdbcClientDetailsService(){
return new JdbcClientDetailsService(dataSource);
}

/**
* token保存策略
* @return
*/
@Bean
public TokenStore tokenStore(){
return new JdbcTokenStore(dataSource);
}

/**
* 授權信息保存策略
* @return
*/
@Bean
public ApprovalStore approvalStore(){
return new JdbcApprovalStore(dataSource);
}

/**
* 授權碼模式數據來源
* @return
*/
@Bean
public AuthorizationCodeServices authorizationCodeServices(){
return new JdbcAuthorizationCodeServices(dataSource);
}

③重寫方法進行配置

/**
* 用來配置客戶端詳情服務(ClientDetailsService)
* 客戶端詳情信息在這里進行初始化
* 指定客戶端信息的數據庫來源
* @param clients
* @throws Exception
*/
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(jdbcClientDetailsService());
}

/**
* 檢測 token 的策略
* @param security
* @throws Exception
*/
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security
//允許客戶端以form表單的方式將token傳達給我們
.allowFormAuthenticationForClients()
//檢驗token必須需要認證
.checkTokenAccess("isAuthenticated()");
}


/**
* OAuth2.0的主配置信息
* @param endpoints
* @throws Exception
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
//刷新token時會驗證當前用戶是否已經通過認證
.userDetailsService(userService)
.approvalStore(approvalStore())
.authenticationManager(authenticationManager)
.authorizationCodeServices(authorizationCodeServices())
.tokenStore(tokenStore());
}

其它關于用戶表和權限表的代碼可參考源碼,回復“oauth2”獲取源碼。

模式

授權碼模式

我們前邊所講的內容都是基于授權碼模式,授權碼模式被稱為最安全的一種模式,它獲取令牌的操作是在兩個服務端進行的,極大的減小了令牌泄漏的風險。

啟動兩個服務,當我們再次請求127.0.0.1:9002/product/findAll接口時會提示以下錯誤

{
"error": "unauthorized",
"error_description": "Full authentication is required to access this resource"
}

①調用接口獲取授權碼

發送127.0.0.1:9001/oauth/authorize?response_type=code&client_id=cheetah_one?請求,前邊的路徑是固定形式的,response_type=code?表示獲取授權碼,client_id=cheetah_one表示客戶端的名稱是我們數據庫配置的數據。

圖片

該頁面是oauth2?的默認頁面,輸入用戶的賬戶密碼點擊登錄會提示我們進行授權,這是數據庫oauth_client_details?表我們設置autoapprove?為false起到的效果。

圖片

選擇Approve?點擊Authorize?按鈕,會發現我們設置的回調地址(oauth_client_details?表中的web_server_redirect_uri?)后邊拼接了code值,該值就是授權碼。

圖片

查看數據庫發現oauth_approvals和oauth_code表已經存入數據了。

拿著授權碼去獲取token

圖片

獲取到token?之后oauth_access_token和oauth_refresh_token?表中會存入數據以用于后邊的認證。而oauth_code?表中的數據被清除了,這是因為code?值是直接暴漏在網頁鏈接上的,oauth2?為了防止他人拿到code非法請求而特意設置為僅用一次。

拿著獲取到的token去請求資源服務的接口,此時有兩種請求方式

圖片

?接下來我們再來看一下oauth2的其它模式。

簡化模式

所謂簡化模式是針對授權碼模式進行的簡化,它將授權碼模式中獲取授權碼的步驟省略了,直接去請求獲取token。?

圖片

流程:發送請求127.0.0.1:9001/oauth/authorize?response_type=token&client_id=cheetah_one?跳轉到登錄頁進行登錄,response_type=token?表示獲取token。

輸入賬號密碼登錄之后會直接在瀏覽器返回token?,我們就可以像授權碼方式一樣攜帶token去請求資源了。

圖片

該模式的弊端就是token直接暴漏在瀏覽器中,非常不安全,不建議使用。

密碼模式

密碼模式下,用戶需要將賬戶和密碼提供給客戶端向認證服務器申請令牌,所以該種模式需要用戶高度信任客戶端。

圖片

流程:請求如下

圖片

獲取成功之后可以去訪問資源了。

客戶端模式

客戶端模式已經不太屬于??oauth2??的范疇了,用戶直接在客戶端進行注冊,然后客戶端去認證服務器獲取令牌時不需要攜帶用戶信息,完全脫離了用戶,也就不存在授權問題了。

圖片

發送請求如下

圖片

獲取成功之后可以去訪問資源了。

刷新token

圖片

權限校驗

除了我們在數據庫中為客戶端配置資源服務外,我們還可以動態的給用戶分配接口的權限。

①開啟Security內置的動態配置

在開啟資源服務時給ResourceServerConfig?類增加注解@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)

②給接口增加權限

@GetMapping("/findAll")
@Secured("ROLE_PRODUCT")
public String findAll(){
return "產品列表查詢成功";
}

③在用戶登錄時設置用戶權限

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser sysUser = this.baseMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username));
sysUser.setRoleList(AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_PRODUCT"));
return sysUser;
}

然后測試會發現可以正常訪問。

采坑

包名問題

當我在創建項目的時候,給product?和server兩個模塊設置了不同的包名,導致發送請求獲取資源時報錯。

經過分析得知,在登錄賬號時會將用戶的信息存儲到oauth_access_token?表的authentication?中,在進行token?校驗時會根據token_id?取出該字段進行反序列化,如果此時發現包名不一致便會導致解析token失敗,因此請求資源失敗。

解決思路

兩個項目的包名改為一致;

可以將用戶和權限的實體抽成單獨的模塊,供其它模塊引用;

loadUserByUsername?方法中使用的用戶實體類不需要繼承UserDetailsService?類,每次返回時用user類包裝一下即可;

數據庫問題

當我在進行權限校驗測試時,在設置權限時發現少打了一個單詞,導致請求一直出錯。修改完成之后繼續請求,仍提示權限不足。

于是我將數據庫中oauth_refresh_token?和oauth_access_token的數據清除,重新開始測試就可以了。

個人認為是生成token?時發現數據庫中token?存在,故不刷新token?,但進行校驗時卻用帶有權限標識的token前去校驗導致失敗。

至于其它的小坑在這不再贅述,如果遇到問題,建議按照流程對比我的源碼仔細檢查,回復“oauth2”獲取源碼。

小結

本文從原理、應用場景、認證流程出發,對oauth2進行了基本的講解,并且手把手帶大家完成了項目的搭建。大家在對授權碼模式、簡化模式、密碼模式、客戶端模式進行測試的同時要將重點放到授權碼模式上。


責任編輯:武曉燕 來源: 阿Q說代碼
相關推薦

2020-11-16 08:37:16

MariaDB性能優化

2018-06-26 14:42:10

StringJava數據

2023-06-26 11:59:52

標簽質量梳理

2021-09-01 09:32:40

工具

2011-06-22 09:37:03

桌面虛擬化存儲

2020-05-16 13:25:03

分析網購數據

2020-12-02 09:36:09

處理器手機卡頓

2025-06-24 09:16:48

2020-07-29 09:21:34

Docker集群部署隔離環境

2024-12-13 08:06:38

Java分類理

2020-12-31 07:57:25

JVM操作代碼

2021-09-21 16:18:07

手機電池快充

2020-03-02 15:17:37

云原生CNCF容器

2019-07-04 09:13:04

中臺百度團隊

2021-02-25 08:21:38

高可用風險故障

2017-08-15 08:27:48

云備份問題恢復

2020-12-16 11:09:27

JavaScript語言開發

2024-04-01 10:09:23

AutowiredSpring容器

2020-10-29 10:35:53

Nginx架構服務器

2021-11-19 06:50:17

OAuth協議授權
點贊
收藏

51CTO技術棧公眾號

国产一区二区三区不卡在线| 六月丁香在线视频| 视频亚洲一区二区| 五月激情丁香一区二区三区| 日本不卡二区| av网站在线免费看| 久久久夜精品| 欧美日韩ab片| 亚洲精品成人av久久| 一区二区三区在线资源| 欧美性猛交xxxxxxxx| 欧美视频在线第一页| 国产有码在线| 不卡av在线免费观看| 国产精品视频一区国模私拍| 中文字幕亚洲欧美日韩| 免费久久精品| 精品久久人人做人人爽| 在线观看高清免费视频| 精品众筹模特私拍视频| 亚洲三级久久久| 日本不卡二区高清三区| 色呦呦免费观看| 国产一区二区三区av电影 | 四虎影院观看视频在线观看 | 久久久久久久久久久久久久久久久 | 少妇淫片在线影院| 中文字幕免费观看一区| 97久久人人超碰caoprom欧美 | 91精品国产色综合久久久蜜香臀| 男人揉女人奶房视频60分| av免费在线观看网站| 国产欧美日韩三区| 蜜桃999成人看片在线观看| 亚洲国产精品久久久久爰性色| 免费视频最近日韩| 国产成人精彩在线视频九色| 欧美精品一区二区蜜桃| 围产精品久久久久久久| 一区二区三区精品99久久| 国产精品一级黄片| 久久精品66| 亚洲成av人影院在线观看| 18禁一区二区三区| 成人污版视频| 欧美一区二区三区在线观看视频| 爱情岛论坛亚洲首页入口章节| 欧美色999| 日本高清无吗v一区| 99色精品视频| 欧美成人免费电影| 色域天天综合网| 日本三级免费观看| 欧美自拍电影| 欧美在线三级电影| mm131国产精品| 亚洲精品三区| 欧美一区二区在线免费播放| 亚洲色图欧美自拍| 久久天堂久久| 欧美成人在线直播| 日本少妇xxxx| 妖精一区二区三区精品视频| 亚洲一级黄色片| 青青青视频在线免费观看| 日韩在线高清| 色综合天天综合网国产成人网| 青草草在线视频| 影音先锋在线一区| 人人爽久久涩噜噜噜网站| 销魂美女一区二区| 久久er99热精品一区二区| 亚洲va国产va天堂va久久| 成人午夜视频一区二区播放| av中文字幕在线不卡| 欧美亚洲爱爱另类综合| 92国产在线视频| 亚洲精品欧美激情| 又粗又黑又大的吊av| 91亚洲精品| 日韩精品一区国产麻豆| 国产精品无码一区二区三区免费 | 免费成人毛片| 日韩午夜中文字幕| 天堂久久久久久| 成人羞羞网站入口| 欧美疯狂xxxx大交乱88av| 精品成人av一区二区在线播放| 久久一本综合频道| 亚洲精品欧美一区二区三区| 日本一本草久在线中文| 中文字幕一区二区不卡| 久久久亚洲国产精品| 成人在线观看免费播放| 亚洲成人久久久久| 中文字幕在线观看二区| 亚洲黄色三级| 国产精品欧美久久久| 日韩中文字幕影院| 国产精品久久看| 欧美精品自拍视频| 亚洲91在线| 日韩激情片免费| 校园春色 亚洲| 天使萌一区二区三区免费观看| 91精品国产综合久久久久久久久| 四虎电影院在线观看| 自拍偷拍亚洲综合| 免费黄色特级片| 亚洲国产aⅴ精品一区二区| 国产午夜精品一区二区三区| 国产一级免费观看| 极品少妇xxxx精品少妇偷拍| 欧美日韩国产精品一卡| 欧美女同一区| 日韩午夜av一区| 2017亚洲天堂| 视频一区二区三区中文字幕| 成人免费91在线看| 免费av在线| 欧美日韩国产一区二区| 一级全黄裸体片| 国产精品久久久久久| 欧美中文在线视频| 无码精品黑人一区二区三区| 亚洲最新在线观看| 日本一二三四区视频| 日韩电影免费在线观看| 国产成人精品久久| 亚州视频一区二区三区| 亚洲午夜在线电影| 在线观看免费看片| 亚洲精品中文字幕乱码| 国产精品久久久久久av下载红粉 | 国产97色在线|日韩| 色婷婷av一区二区三| 亚洲精品乱码久久久久久| 在线观看av网页| 不卡一区2区| 国产精品激情av电影在线观看 | 国产精品宾馆| 久久久久久91| 女人18毛片一区二区三区| 一区二区欧美视频| 老熟女高潮一区二区三区| 日韩国产欧美| 国产在线视频91| 国产黄大片在线观看画质优化| 欧美日韩一本到| 中文字幕求饶的少妇| 久久激五月天综合精品| 亚洲一区三区电影在线观看| 国产欧美自拍| 久久成人国产精品| 精品人妻一区二区三区麻豆91| 亚洲精品免费在线| 中文字幕一区二区三区人妻在线视频| 国产精品theporn| 国产日韩一区二区三区| 中文字幕在线免费观看视频| 亚洲男人天堂九九视频| 日本精品入口免费视频| 国产精品女人毛片| 日本在线观看视频一区| 亚洲网站啪啪| 欧美13一14另类| 久久精品 人人爱| 美女少妇精品视频| 人妻va精品va欧美va| 欧美日韩美女视频| 亚洲一级片在线播放| 国产麻豆午夜三级精品| 鲁一鲁一鲁一鲁一澡| 精品日韩欧美一区| 3d蒂法精品啪啪一区二区免费| av3级在线| 一区二区三区 在线观看视| 99精品免费观看| 天天影视色香欲综合网老头| 97人妻人人揉人人躁人人| 国内欧美视频一区二区| 一二三四视频社区在线| 欧美日韩一二| 动漫一区二区在线| 日韩精品一区二区三区av| 美女精品久久久| 偷拍自拍在线| 在线不卡欧美精品一区二区三区| 亚洲精品午夜久久久久久久| 国产女同互慰高潮91漫画| 亚洲三级在线视频| 久久精品毛片| 久久综合亚洲精品| 国产精品片aa在线观看| 亚洲综合在线做性| 日韩a**中文字幕| 国内成人精品一区| 欧美a在线看| 日韩国产精品视频| 国产手机精品视频| 在线一区二区三区做爰视频网站| 欧美色图亚洲视频| 国产欧美一区二区三区在线老狼| 无码人妻一区二区三区在线视频| 丝袜亚洲另类欧美| 男人添女人荫蒂免费视频| 久久国产小视频| 美乳视频一区二区| 国产精品男女| 亚洲精品日韩av| 欧美jizz18| 日本欧美国产在线| 成年人视频免费在线播放| 日韩一区二区在线视频| 天堂资源中文在线| 精品国产电影一区二区| 一二三四区在线| 在线视频亚洲一区| 日韩欧美a级片| 洋洋成人永久网站入口| 亚洲天堂一级片| 中文字幕免费在线观看视频一区| 国产成人无码一区二区在线观看| 国产乱一区二区| www.色就是色.com| 蜜桃视频在线观看一区| 青青在线免费观看视频| 亚洲在线电影| av免费观看网| 国产精品亚洲欧美| 日本一区二区黄色| 99热在线精品观看| 妞干网在线视频观看| 亚洲高清网站| 热99这里只有精品| 激情久久久久久久| 国产精品国产对白熟妇| 国内精品久久久久久久影视蜜臀| 好色先生视频污| 永久亚洲成a人片777777| 国产高潮呻吟久久久| 国产精品久久久乱弄| 中文字幕免费在线不卡| 羞羞答答成人影院www| 影音先锋亚洲视频| 亚洲国产精品久久久久蝴蝶传媒| 中文字幕剧情在线观看一区| 久久久久久免费视频| 国产奶头好大揉着好爽视频| 亚洲第一天堂| 狠狠噜天天噜日日噜| 亚洲午夜伦理| 你懂的av在线| 香蕉久久a毛片| 无码日韩人妻精品久久蜜桃| 日本中文一区二区三区| 亚洲色图 在线视频| 久久精品国内一区二区三区| 五月天婷婷亚洲| 国产精品白丝av| 成年女人免费视频| 91视频精品在这里| 精品无码国产污污污免费网站 | 三级三级久久三级久久18| 不卡一区2区| 欧美a级黄色大片| 亚洲激情午夜| 另类小说第一页| 国产美女视频一区| 欲求不满的岳中文字幕| 国产午夜精品在线观看| 亚洲天堂一级片| 天天免费综合色| 99久久久无码国产精品免费蜜柚| 欧美日本一道本在线视频| 国产高中女学生第一次| 日韩精品在线观看一区| 一级毛片视频在线| 久久久久五月天| 国模一区二区| 亚洲a一级视频| 爽爽窝窝午夜精品一区二区| 亚洲欧洲日韩精品| 欧美日韩久久| 日本女优爱爱视频| 国产在线视视频有精品| 人妻丰满熟妇aⅴ无码| 亚洲欧洲日本在线| 欧美成人精品欧美一级乱黄| 91国产视频在线观看| 亚洲国产福利视频| 深夜福利亚洲导航| 成av人片在线观看www| 国产精品久久91| 久久久久久毛片免费看| 中文字幕中文字幕一区三区| 国产精品久久久久久模特| 99九九精品视频| 国产网红主播福利一区二区| 久久综合久久鬼| 欧美日韩国产色站一区二区三区| 可以免费看毛片的网站| www国产精品视频| 最新中文字幕在线播放| aa成人免费视频| 99久久精品费精品国产风间由美| 成人性免费视频| 国产一区二区福利| 日本欧美一区二区三区不卡视频| 五月天欧美精品| 国产黄色一区二区| 中日韩午夜理伦电影免费| 英国三级经典在线观看| 91福利视频导航| 色喇叭免费久久综合网| 日韩毛片在线免费看| 北条麻妃一区二区三区| 黄色录像一级片| 91久久久免费一区二区| 性高潮久久久久久久久久| 欧美国产极速在线| 96视频在线观看欧美| 亚洲欧美日韩国产yyy| 久久久久免费| 中文人妻一区二区三区| 亚欧色一区w666天堂| www.中文字幕| 欧美激情第6页| 涩爱av色老久久精品偷偷鲁| 国产精品h视频| 激情图片小说一区| 日韩av手机在线免费观看| 欧美日韩另类一区| 成人午夜电影在线观看| 日韩美女主播视频| 天天躁日日躁狠狠躁欧美巨大小说| 狠狠噜天天噜日日噜| 国产福利精品一区二区| 欧美成人一二三区| 日韩视频免费直播| 国产白丝在线观看| 国产精品一区二区免费| 亚洲国产清纯| 久久人人爽人人爽人人片| 欧美视频在线视频| 欧美一区二区少妇| 国产精品av电影| 日韩欧美三级| 天堂网成人在线| 亚洲一区二区三区影院| 天堂av手机版| 日本久久精品视频| 成人免费电影网址| 亚洲第一色av| 夜夜亚洲天天久久| 天堂资源中文在线| 国产精品久久久久久久久免费| 日韩情爱电影在线观看| 五月天开心婷婷| 一二三区精品福利视频| 视频二区在线观看| 国产成人精品在线| 国产精品7m凸凹视频分类| 麻豆精品国产传媒| 岛国av在线不卡| jyzzz在线观看视频| 亚洲一区二区三区在线免费观看| 欧美日韩亚洲三区| 亚洲乱码国产乱码精品精大量| 色婷婷av一区二区三区gif| aaa日本高清在线播放免费观看| 成人黄色片网站| 亚洲大片在线| 国产三级短视频| 日韩女优毛片在线| 中文字幕在线高清| 日日噜噜夜夜狠狠久久丁香五月| av在线不卡免费看| 中国a一片一级一片| 欧美疯狂性受xxxxx另类| 国产91一区| 中文字幕乱码在线人视频| 欧美性开放视频| www红色一片_亚洲成a人片在线观看_| 国产视频在线观看一区| 日本不卡视频一二三区| 欧美精品久久久久性色| 在线播放日韩av| 成人激情自拍| 欧美男女交配视频| 亚洲3atv精品一区二区三区| youjizz在线播放| 古典武侠综合av第一页| 欧美a一区二区| 日韩免费黄色片| 不卡av电影在线观看| 亚洲欧美tv| 亚洲香蕉中文网| 欧美精选午夜久久久乱码6080| 黄色aa久久|