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

如何給自研 MCP 服務,加上安全認證?

人工智能
Spring AI 是有意提供基于自家的 OAuth2 框架,完成 MCP 服務的多樣性權限校驗的。不過目前提供的方案能用,但不算成熟。

一、舉例,對接高德地圖 MCP

高德地圖 MCP Server;

{
  "mcpServers": {
    "amap-amap-sse": {
      "url": "https://mcp.amap.com/sse?key=您在高德官網上申請的key"
    }
  }
}
  • 官網:https://lbs.amap.com/api/mcp-server/gettingstarted  - 官網提供了創建對接 Key

1. 代碼使用示例

@Configuration
publicclass McpConfig {

    @Bean
    public List<NamedClientMcpTransport> mcpClientTransport() {
        McpClientTransport transport = HttpClientSseClientTransport
                .builder("https://mcp.amap.com")
                .sseEndpoint("/sse?key=<your_key>")
                .objectMapper(new ObjectMapper())
                .build();

        return Collections.singletonList(new NamedClientMcpTransport("amap", transport));
    }
    
}
  • 對接時,需要設定 sseEndpoint 如果不設定個,Spring AI 默認是對 builder 的 baseUrl 值添加 /sse 的。
  • 所以,如果你要對接外部帶有驗證權限的 MCP 服務,需要手動設置下 sseEndpoint 值。

2. 項目中的配置

小傅哥,帶著大家做的 Ai Agent,也支持了外部的這些帶有權限校驗的 MCP 服務。你可以,以多種方式進行配置。如;

{
 "baseUri":"https://mcp.amap.com",
        "sseEndpoint":"/sse?key=801aabf79ed0ff78603cfe85****"
}
{
 "baseUri":"https://mcp.amap.com",
        "sseEndpoint":"/sse?key=801aabf79ed0ff78603cfe85****"
}
  • 以上兩種配置方式,在 ai-agent-station 都做了兼容處理。以下是兼容代碼,學習這部分項目的伙伴,可以直接閱讀課程代碼。
@Slf4j
@Component
publicclass AiClientToolMcpNode extends AbstractArmorySupport {

   // ... 省略部分代碼

    protected McpSyncClient createMcpSyncClient(AiClientToolMcpVO aiClientToolMcpVO) {
        String transportType = aiClientToolMcpVO.getTransportType();

        switch (transportType) {
            case"sse" -> {
                AiClientToolMcpVO.TransportConfigSse transportConfigSse = aiClientToolMcpVO.getTransportConfigSse();
                // http://127.0.0.1:9999/sse?apikey=DElk89iu8Ehhnbu
                String originalBaseUri = transportConfigSse.getBaseUri();
                String baseUri;
                String sseEndpoint;

                int queryParamStartIndex = originalBaseUri.indexOf("sse");
                if (queryParamStartIndex != -1) {
                    baseUri = originalBaseUri.substring(0, queryParamStartIndex - 1);
                    sseEndpoint = originalBaseUri.substring(queryParamStartIndex - 1);
                } else {
                    baseUri = originalBaseUri;
                    sseEndpoint = transportConfigSse.getSseEndpoint();
                }

                sseEndpoint = StringUtils.isBlank(sseEndpoint) ? "/sse" : sseEndpoint;

                HttpClientSseClientTransport sseClientTransport = HttpClientSseClientTransport
                        .builder(baseUri) // 使用截取后的 baseUri
                        .sseEndpoint(sseEndpoint) // 使用截取或默認的 sseEndpoint
                        .build();

                McpSyncClient mcpSyncClient = McpClient.sync(sseClientTransport).requestTimeout(Duration.ofMinutes(aiClientToolMcpVO.getRequestTimeout())).build();
                var init_sse = mcpSyncClient.initialize();
                log.info("Tool SSE MCP Initialized {}", init_sse);
                return mcpSyncClient;
            }
            case"stdio" -> {
                AiClientToolMcpVO.TransportConfigStdio transportConfigStdio = aiClientToolMcpVO.getTransportConfigStdio();
                Map<String, AiClientToolMcpVO.TransportConfigStdio.Stdio> stdioMap = transportConfigStdio.getStdio();
                AiClientToolMcpVO.TransportConfigStdio.Stdio stdio = stdioMap.get(aiClientToolMcpVO.getMcpName());

                // https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem
                var stdioParams = ServerParameters.builder(stdio.getCommand())
                        .args(stdio.getArgs())
                        .build();
                var mcpClient = McpClient.sync(new StdioClientTransport(stdioParams))
                        .requestTimeout(Duration.ofSeconds(aiClientToolMcpVO.getRequestTimeout())).build();
                var init_stdio = mcpClient.initialize();
                log.info("Tool Stdio MCP Initialized {}", init_stdio);
                return mcpClient;
            }
        }

        thrownew RuntimeException("err! transportType " + transportType + " not exist!");
    }

}
  • 以上代碼,是為了自動化構建 MCP 服務的,其中 case sse 的部分,會對 url 進行拆分,如果本身 url 配置了校驗權限,則不會從另外一個參數獲取,否則從另外參數拼接。這樣就可以很好的擴展用戶配置時的多樣性問題了。


以上是關于帶有權限校驗的 MCP 服務配置的問題,接下來,我們要說下怎么自己開發一個帶有權限校驗

二、實現,帶有權限校驗的 MCP 服務

首先,Spring AI 是有意提供基于自家的 OAuth2 框架,完成 MCP 服務的多樣性權限校驗的。不過目前提供的方案能用,但不算成熟。

圖片圖片

官網:https://spring.io/blog/2025/05/19/spring-ai-mcp-client-oauth2

1. 基于 OAuth2 認證

1.1 工程結構

圖片圖片

  • 工程:https://gitcode.net/KnowledgePlanet/mcp-server-auth - 面向于學習 ai-agent-station 的伙伴
  • 使用 OAuth2 基于 Spring MVC 的方式到也簡單,知道添加配置即可。

1.2 所需的 POM 文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>

1.3 測試驗證

@Slf4j
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "server.shutdown=immediate")
publicclass ApiTest {

    @LocalServerPort
    privateint port;

    privatefinal ObjectMapper objectMapper = new ObjectMapper();

    @Test
    public void test_access_token() throws IOException, InterruptedException {
        String token = obtainAccessToken();
        log.info("token:{}", token);
        // eyJraWQiOiJiMWQ0MGIxNi1hOTYzLTQ2NmYtYTVkOC02NGRjMzg0ODljYWEiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJtY3AtY2xpZW50IiwiYXVkIjoibWNwLWNsaWVudCIsIm5iZiI6MTc0ODA1MTc1NiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1ODA5OCIsImV4cCI6MTc0ODA1MjA1NiwiaWF0IjoxNzQ4MDUxNzU2LCJqdGkiOiI5NjY4ZmZkMi0wNjQ2LTRiNmItODQ4Ni1jYzk3ZjMxNTdmOTEifQ.CG4GYai_NYkmfcqmNi-_HYG06Kan04uNSsC2ivn_eC9Ra6xMKYTs9KIT7k5lKxSFRUOPI7K0zJNVvNXrrIe0iFl-csrG2vGukNTGTPMxtUi2hheBMRbnvjvuojW4DeOEE8UOpdA6uow67ucwcymTlDXE-k7OjRZeyp7UdVz2WyoDFQhLB6ihLbDSj5puAZxfNocirRzo36gmW243aW9f1gugPUcpND-oobc2q8xyBG2cX2AlGXUSS-v9PLjHr2W2smFTKHHGwu7FpMMBnJLUT5gZD0llIg6yqro91nFaAFOpGHXjRZYgVjkRlzxx08Zuquva9PbStxbUl2j8hI43_Q

        var client = HttpClient.newHttpClient();

        var request = HttpRequest.newBuilder()
                .uri(URI.create("http://localhost:" + port + "/sse"))
                .header("Accept", "text/event-stream")
                .header("Authorization", "Bearer " + token)
                .GET()
                .build();

        var responseCode = new AtomicInteger(-1);
        var sseRequest = client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream()).thenApply(response -> {
            responseCode.set(response.statusCode());
            if (response.statusCode() == 200) {
                log.info("response:{}", JSON.toJSONString(response));
                return response;
            }
            else {
                thrownew RuntimeException("Failed to connect to SSE endpoint: " + response.statusCode());
            }
        });

        await().atMost(Duration.ofSeconds(1)).until(sseRequest::isDone);
        assertThat(sseRequest).isCompleted();
        assertThat(responseCode).hasValue(200);
    }

    private String obtainAccessToken() throws IOException, InterruptedException {
        var client = HttpClient.newHttpClient();

        var clearTextCredentials = "mcp-client:secret".getBytes(StandardCharsets.UTF_8);
        var credentials = new String(Base64.getUrlEncoder().encode(clearTextCredentials));
        var request = HttpRequest.newBuilder()
                .uri(URI.create("http://localhost:" + port + "/oauth2/token"))
                .header("Authorization", "Basic " + credentials)
                .header("Content-Type", "application/x-www-form-urlencoded")
                .POST(ofString("grant_type=client_credentials"))
                .build();

        var rawResponse = client.send(request, HttpResponse.BodyHandlers.ofString()).body();

        Map<String, String> response = objectMapper.readValue(rawResponse, Map.class);
        return response.get("access_token");
    }
    
}
  • 加上 OAuth2 以后,就需要獲取并設置 accessToken 才能訪問 sse 服務了。

2. 基于網關實現

其實我們到不非得依賴于 Spring OAuth2 往 MCP 服務里在添加一些其他的東西。倒不如直接走網關,讓網關來管理權限,MCP 服務只做服務的事情就好。

這里我們基于 Nginx 來配置驗證功能,當然你可以在學習本節的案例后,配置任何其他的網關來管理你的 MCP 服務。

注意,這里的前置條件為你已經跟著小傅哥,至少完成了一個 MCP 服務。課程;https://t.zsxq.com/GwNZp

當我們有了一套基于 sse 形式訪問的 mcp 后,我們是可以給這套 mcp 基于 nginx 轉發的形式進行訪問后面真實的 mcp 服務的。在轉發的過程中,拿到用戶在地址 http://127.0.0.1:9999/sse?apikey=DElk89iu8Ehhnbu mcp 服務后面拼接的 apikey,并對 apikey 進行驗證。

2.1 配置工程

圖片圖片

  • 在 ai-agent-station 項目下,提供了 dev-ops-v2 配置 mcp 服務轉發和驗證能力。
  • 注意,部署的時候,要把 mcp.localhost.conf 轉發的 mcp 服務的地址,更換為你的地址。
  • 另外,每一個 mcp.localhost.conf 還可以配置域名,這樣就達到了高德地圖 mcp 訪問的效果。舉例;https://fatie.mcp.bugstack.cn/sse/apikey=*******

2.2 服務轉發&校驗

# 可以負載服務
upstream backend_servers {
    server 192.168.1.108:8101;
}

server {
    listen 80;

    server_name 192.168.1.104;  # 修改為你的實際服務器 IP 或域名【域名需要備案】

    location /sse {
        # 驗證apikey參數,這個apikey也可以對接服務端接口來處理。
        if ($arg_apikey != "DElk89iu8Ehhnbu") {
            return403; # 如果apikey不正確,返回403禁止訪問
        }

        # 重寫URL,去掉apikey參數
        rewrite ^(/sse/)\?apikey=.* $1break;

        proxy_pass http://backend_servers;  # 將請求代理到上游服務器組
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /mcp/message {
        proxy_pass http://backend_servers;  # 將請求代理到上游服務器組
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}
  • 特別注意,mcp 服務是有2個步驟的,一個是 sse 訪問,還有一個 mcp/message 的處理。我們只需要對 sse 的請求進行驗證即可。
  • /sse 請求路徑,需要會提取 apikey 與 nginx 配置的值進行對比,如果不正確則會返回一個 403 禁止訪問,通過則放行。
  • 之后重寫 url 地址,讓轉發到本身 mcp 的地址是干凈的。從 http://127.0.0.1:9999/sse?apikey=DElk89iu8Ehhnbu 驗證轉發后為 http://192.168.1.108:8101/sse

2.3 功能驗證

首先,要確保你的 mcp 服務是可以使用的。如,訪問;http://192.168.1.108:8101/sse 可以獲得到結果。

圖片圖片

- 如圖,驗證成功。我們可以通過轉發的方式進行驗證和使用。 - 另外,有了轉發和驗證,你原本的服務,sse 8101 就不用對外了。只有你的網關(nginx)可以訪問即可。這樣就可以控制權限了。

2.4 動態驗證

那么,目前我們配置的nginx 轉發這不是一個固定的權限賬號嗎,怎么讓不同的接入方都申請一個秘鑰key來使用呢?這里我們需要使用到 nginx 的 auth 認證模塊。

# 可以負載服務
upstream backend_servers {
    server 192.168.1.108:8101;
}

server {
    listen 80;

    server_name 192.168.1.104;  # 修改為你的實際服務器 IP 或域名【域名需要備案】

    location /sse {
        auth_request /auth;

        # 重寫URL,去掉apikey參數
        rewrite ^(/sse/)\?apikey=.* $1break;

        proxy_pass http://backend_servers;  # 將請求代理到上游服務器組
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /mcp/message {
        proxy_pass http://backend_servers;  # 將請求代理到上游服務器組
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

     location = /auth {
        # 發送子請求到HTTP服務,驗證客戶端的憑據,返回響應碼
        internal;
        # 設置參數
        set $query '';
        if ($request_uri ~* "[^\?]+\?(.*)$") {
            set $query $1;
        }
        # 驗證成功,返回200 OK
        proxy_pass http://207.246.123.*:8090/auth/token?$query;
        # 發送原始請求
        proxy_pass_request_body off;
        # 清空 Content-Type
        proxy_set_header Content-Type "";
     }  

}
  • 在訪問 /sse 的時候,增加 auth 認證,auth 來訪問本地一個 http 接口。你可以是 SpringBoot 實現的接口。這個接口負責驗證你的秘鑰是否正確。同時你的 SpringBoot 服務還可以提供出一個創建秘鑰的平臺,讓接入方使用。
  • 其實類似這樣的場景,使用功能更加豐富的 api 網關都是自帶的,或者 github 一些專門為 mcp 做網關服務的也都有。
責任編輯:武曉燕 來源: bugstack蟲洞棧
相關推薦

2020-05-29 10:12:49

服務器

2018-05-28 22:06:37

阿里云自研安全

2025-09-24 10:21:11

2020-06-11 17:48:58

蘋果Mac芯片

2023-06-29 11:06:46

vivoID服務器

2025-08-07 07:50:46

2022-11-23 18:39:06

智能質檢

2015-10-13 18:20:49

互聯網

2025-03-13 03:00:00

DockerAgentic工具

2009-03-17 15:10:50

2019-08-01 17:37:24

2017-07-14 15:12:27

核心引擎架構

2022-05-17 17:18:40

Kite字節跳動微服務框架

2023-08-09 20:43:32

2022-09-06 09:51:36

芯片特斯拉

2025-08-19 09:58:38

2024-03-05 18:36:21

轉換引擎用戶體驗

2020-04-16 11:36:59

PixelGoogle芯片

2012-02-17 13:39:03

CornerstoneAndroid平板
點贊
收藏

51CTO技術棧公眾號

狠狠入ady亚洲精品经典电影| 久久久精品一区二区毛片免费看| 99免费精品在线观看| 国产69久久精品成人| 超碰97人人干| 欧美视频在线视频精品| 亚洲综合成人在线| 欧美亚洲免费在线| 国产成人a人亚洲精品无码| 一区在线视频| 最近2019好看的中文字幕免费 | 男女精品网站| 久久最新资源网| 在线观看国产免费视频| 狠狠久久综合| 欧美日韩国产麻豆| 免费成人进口网站| 男人天堂亚洲二区| 国产成人亚洲精品狼色在线| 日本一欧美一欧美一亚洲视频| 免费91在线观看| 狼人天天伊人久久| 欧美肥妇毛茸茸| 亚洲熟妇国产熟妇肥婆| 丝袜美腿美女被狂躁在线观看| 成人av综合在线| 国产精品一区二区三区久久| 日韩人妻无码一区二区三区99| 色97色成人| 亚洲精品suv精品一区二区| 久久6免费视频| 三级成人在线| 无吗不卡中文字幕| www.18av.com| 精品国产白色丝袜高跟鞋| 久久―日本道色综合久久| 成人xxxxx色| 亚洲系列第一页| 久久久久免费| 欧美一乱一性一交一视频| 亚洲精品在线观看av| 中文字幕一区二区三区欧美日韩| 在线丨暗呦小u女国产精品| 国产精品无码专区| 美女一区二区在线观看| 欧美一二三区在线观看| 中文字幕第100页| 91九色综合| 在线视频欧美区| 久久无码高潮喷水| 欧美男男激情videos| 午夜精品成人在线视频| 国产日韩亚洲欧美在线| 羞羞网站在线免费观看| 日韩久久一区二区| 尤物一区二区三区| 日本高清视频在线播放| 中文字幕一区三区| 一区二区三区|亚洲午夜| 91在线视频| 亚洲欧洲av在线| 中文字幕一区二区三区最新 | 欧美精品激情在线| 欧美被狂躁喷白浆精品| 欧美视频二区| 性欧美xxxx视频在线观看| 国产极品在线播放| 亚洲九九精品| 日韩免费观看网站| 欧美国产一级片| 另类欧美日韩国产在线| 91精品在线播放| 亚洲成人av综合| kk眼镜猥琐国模调教系列一区二区| 国产99在线免费| 亚洲av激情无码专区在线播放| 91丨porny丨在线| 欧美日韩成人一区二区三区| 成人免费在线观看| 亚洲人吸女人奶水| 欧美日韩福利在线| 自拍偷拍欧美视频| 欧美午夜片在线看| 亚洲成人福利视频| 日韩在线黄色| www.日本久久久久com.| 久久免费播放视频| 美女爽到呻吟久久久久| 91精品综合久久久久久五月天| 国产浮力第一页| 91亚洲精品一区二区乱码| 视频一区三区| 免费毛片在线看片免费丝瓜视频| 欧美日韩国产丝袜另类| 日本xxxx黄色| 91成人午夜| 一区二区三区黄色| 久久久久久久久久久网| 男女精品网站| 99久久精品无码一区二区毛片 | 国产精品久久久久久久久久白浆| 亚洲白虎美女被爆操| 黄色片在线观看免费| 欧美日韩国产欧| 国产精品美女呻吟| 天天av天天翘| 亚洲欧美国产高清| 成人午夜视频免费在线观看| 欧美专区一区| 尤物九九久久国产精品的特点 | 三级久久三级久久久| 91久久精品国产| 日本不卡免费播放| 亚洲精品高清在线观看| 亚洲精品一二三四五区| 国产精品巨作av| 久久久精品网站| 日本精品入口免费视频| youjizz国产精品| 国产盗摄视频在线观看| 波多野结衣久久精品| 精品女同一区二区| 国产天堂av在线| 秋霞电影一区二区| 久久久久久99| av3级在线| 欧美大片顶级少妇| 希岛爱理中文字幕| 蜜臀av一区二区| 免费一区二区三区| 日韩伦理在线一区| 亚洲成人亚洲激情| 久久一二三四区| 国内外成人在线视频| 欧美一级爽aaaaa大片| 桃色av一区二区| 日韩国产中文字幕| 日本少妇bbwbbw精品| 福利一区福利二区| 日韩精品久久一区二区| 精品中文字幕一区二区三区| 日韩亚洲欧美成人| 一二三四区在线| 国产精品热久久久久夜色精品三区| 黄色a级片免费| 亚洲亚洲免费| 欧美一区二区三区四区在线| 性感美女福利视频| 欧美日韩亚洲一区二区三区| 欧美无人区码suv| 亚洲综合二区| 日本一区二区高清视频| 日韩一区二区三区在线免费观看 | 亚洲日本精品视频| 久久精品1区| 欧美一区激情视频在线观看| 免费观看成人性生生活片 | 精品国产一区二区三区四区精华 | 亚洲精品免费在线视频| av网站在线看| 亚洲成人久久网| 国产精品久久久久久久久久久久久久久久久| youjizz国产精品| 精品一卡二卡三卡| 日韩在线观看一区| 成人免费淫片aa视频免费| 国产在线观看a视频| 日韩精品一区二区三区在线 | 日韩欧美国产视频| 干b视频在线观看| 久久国产婷婷国产香蕉| 成人黄色片免费| 精品素人av| 国产精品极品尤物在线观看| 人人干在线视频| 欧美一级精品大片| 日韩精品一卡二卡| 国产女人18毛片水真多成人如厕 | 亚洲视频一二三区| 精品伦一区二区三区| 国产欧美一区二区三区国产幕精品| 你懂的网址一区二区三区| 亚洲电影有码| 欧美日韩aaaa| 经典三级在线| 欧美一区二区成人6969| 日韩精品手机在线| 亚洲欧洲日产国码二区| 五十路六十路七十路熟婆 | 特黄特黄一级片| 午夜亚洲伦理| 18视频在线观看娇喘| 天天做夜夜做人人爱精品 | 毛片av免费在线观看| 色一区二区三区四区| 成人三级在线| 99久久婷婷国产综合精品首页| 欧美精品一区三区| 国产美女性感在线观看懂色av| 欧美一级欧美一级在线播放| 9i精品福利一区二区三区| 亚洲欧美国产77777| 性欧美13一14内谢| 丁香桃色午夜亚洲一区二区三区| 亚洲色精品三区二区一区| 欧美日韩1080p| 日本高清久久一区二区三区| 欧美国产亚洲精品| 国产精品久久不能| rebdb初裸写真在线观看| 中文字幕日韩精品在线| 四季av日韩精品一区| 欧美裸体一区二区三区| 天天干天天操天天爱| 亚洲国产欧美在线| 男人的午夜天堂| 国产婷婷色一区二区三区四区| 一级黄色免费视频| 国产综合久久久久影院| 久久精品一区二| 国产精品久久久久久久免费软件| 精品国产三级a∨在线| 水蜜桃久久夜色精品一区| 欧美精品一区二区视频| 国产精品sss在线观看av| 亚洲free嫩bbb| 日本欧美在线| 国产精品欧美一区二区三区奶水| 九色porny视频在线观看| 欧美激情亚洲综合一区| mm1313亚洲国产精品美女| 中文字幕亚洲欧美| 国产尤物视频在线| 国产亚洲欧美视频| 欧美男男同志| 亚洲美女性生活视频| 欧洲亚洲在线| 日韩精品亚洲精品| 丝袜+亚洲+另类+欧美+变态| 日韩精品久久久久久久玫瑰园 | 国产aⅴ精品一区二区三区色成熟| 91小视频网站| 另类中文字幕网| 中文av一区二区三区| 欧美a级一区二区| 亚洲黄色av网址| 青青草原综合久久大伊人精品优势 | 白嫩情侣偷拍呻吟刺激| 成人午夜免费视频| 91九色蝌蚪porny| www.久久精品| 色欲av无码一区二区三区| 久久免费的精品国产v∧| 成年人网站免费在线观看| 久久久一区二区| 亚洲无人区码一码二码三码的含义| 久久久久久久综合色一本| 性欧美一区二区| 中文字幕 久热精品 视频在线| 69xxx免费| ㊣最新国产の精品bt伙计久久| 亚洲精品久久久久久国| 亚洲激情成人在线| 日韩激情一区二区三区| 天天操天天干天天综合网| 日韩视频在线观看一区| 欧美色网站导航| 国产熟女精品视频| 亚洲精品一区二区三区香蕉| 亚洲欧美日韩动漫| 国产亚洲欧美视频| 超碰个人在线| 亚州av一区二区| yy6080久久伦理一区二区| 成人久久精品视频| 成人h动漫精品一区二区器材| 精品伦精品一区二区三区视频| 国产真实有声精品录音| 成人手机视频在线| 亚洲欧洲综合| 黄色片视频在线| 丁香婷婷综合激情五月色| 91成人破解版| 亚洲欧美日韩国产成人精品影院| 国产无精乱码一区二区三区| 欧美午夜精品一区| 精品人妻一区二区三区换脸明星| 亚洲国产成人一区| 9191在线| 欧美激情2020午夜免费观看| 色老太综合网| av免费观看久久| 精品一区不卡| 国产欧美日韩小视频| 免费不卡在线视频| www.com日本| 国产精品妹子av| 日本一级一片免费视频| 欧美挠脚心视频网站| 少妇人妻偷人精品一区二区| 日韩最新在线视频| 性欧美xxx69hd高清| 91亚洲人电影| 狠狠综合久久av一区二区蜜桃| 久久观看最新视频| 免费在线日韩av| 成人欧美精品一区二区| 国产精品乱子久久久久| 男女视频免费看| 日韩一区二区中文字幕| yourporn在线观看视频| 97精品国产97久久久久久| 91精品视频一区二区| 日本一区二区在线视频观看| 最新日韩av| 性一交一黄一片| 国产精品国产a级| 在线观看中文字幕视频| 日韩视频一区二区在线观看| seseavlu视频在线| 国产91网红主播在线观看| 白白在线精品| 中文精品无码中文字幕无码专区| 日本va欧美va欧美va精品| 手机av免费看| 欧美性xxxx极品hd满灌| 刘亦菲毛片一区二区三区| 久久久国产精彩视频美女艺术照福利| 台湾佬成人网| 乱一区二区三区在线播放| 亚洲精品偷拍| www.美色吧.com| 夜夜亚洲天天久久| 精品国产无码一区二区| 精品国产美女在线| 欧美成人一二区| 亚洲一卡二卡三卡| 日本三级亚洲精品| 亚洲AV无码成人精品区明星换面| 欧美天天综合色影久久精品| 午夜小视频免费| 7777免费精品视频| 偷窥自拍亚洲色图精选| 尤物av无码色av无码| 99riav一区二区三区| 日韩免费一级片| 日韩电影第一页| 成年美女黄网站色大片不卡| 欧美日韩亚洲一区二区三区在线观看 | 久久视频在线视频| 国产麻豆精品| 菠萝蜜视频在线观看入口| 成人在线视频一区二区| 日韩激情在线播放| 亚洲老头同性xxxxx| 校园春色亚洲色图| 视频一区免费观看| 韩国午夜理伦三级不卡影院| 久久精品黄色片| 亚洲大胆人体视频| 中文字幕在线免费观看视频| 欧洲精品一区色| 久久激五月天综合精品| 麻豆changesxxx国产| 亚洲国产一区二区三区在线观看| 三级中文字幕在线观看| 日产精品久久久一区二区| 美女网站视频久久| 日韩成人毛片视频| 日韩av在线最新| 久久精品国产精品亚洲毛片| 中文字幕在线中文| 99精品视频中文字幕| 欧美日韩a v| zzjj国产精品一区二区| 成人影院中文字幕| 国产精品亚洲a| 亚洲男人的天堂网| 四虎在线视频| 91精品中文在线| 一区二区黄色| 天堂а√在线中文在线鲁大师| 日韩一区二区三区在线| 国模冰冰炮一区二区| 中文字幕av导航| 91在线云播放| 国产口爆吞精一区二区| 国内精品视频一区| 欧美freesextv| 日韩综合第一页| 欧美日韩在线亚洲一区蜜芽| 免费在线观看av电影| 亚洲精品乱码久久久久久蜜桃91 | 国产精品69久久久久孕妇欧美| 日韩一区二区在线观看视频| 性高爱久久久久久久久| 最新av网址在线观看| 久久精品人人做人人综合| 国产富婆一级全黄大片| 国产精品91在线观看|