日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

钉钉企业应用C#开发笔记之一(免登)

發布時間:2023/12/29 综合教程 50 生活家
生活随笔 收集整理的這篇文章主要介紹了 钉钉企业应用C#开发笔记之一(免登) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于釘釘

釘釘是阿里推出的企業移動OA平臺,本身提供了豐富的通用應用,同時其強大的后臺API接入能力讓企業接入自主開發的應用成為可能,可以讓開發者實現幾乎任何需要的功能。

近期因為工作需要研究了一下釘釘的接入,發現其接入文檔、SDK都是基于java編寫的,而我們的企業網站使用Asp.Net MVC(C#)開發,所以接入只能從頭自己做SDK。

接入主要包括免登、獲取數據、修改數據等接口。

免登流程

首先需要理解一下釘釘的免登流程,借用官方文檔的圖片:

是不是很熟悉?是的,基本是按照OAUTH的原理來的,版本嘛,里面有計算簽名的部分,我覺得應該是OAUTH1.0。

有的讀者會問,那第一步是不是應該跳轉到第三方認證頁面啊。我覺得“魔法”就藏在用來打開頁面的釘釘內置瀏覽器里,在dd.config()這一步里,“魔法”就生效了。

其實簡單來說,主要分為五步:

在你的Web服務器端調用api,傳入CorpId和CorpSecret,獲取accessToken,即訪問令牌。
在服務器端調用api,傳入accessToken,獲取JsApiTicket,即JsApi的訪問許可(門票)。
按照既定規則,在后臺由JsApiTicket、NonceStr、Timestamp、本頁面Url生成字符串,計算SHA1消息摘要,即簽名Signature。
將AgentId、CorpId、Timestamp、NonceStr、Signature等參數傳遞到前臺,在前臺調用api,得到authCode,即授權碼。
根據授權碼,在前臺或后臺調用api,獲得userId,進而再根據userId,調用api獲取用戶詳細信息。

PS:為什么需要在后臺完成一些api的調用呢?應該是因為js跨域調用的問題,我具體沒有深究。

實踐方法

理解了上述步驟,我對登陸過程的實現也大致有了一個設想,既然免登需要前后端一起來完成,那就添加一個專門的登陸頁面,將登陸過程都在里面實現,將登陸結果寫入到Session,并重定向回業務頁面,即算完成。圖示如下:

其中每個api的調用方式,在官方文檔中都有說明。同時,我在阿里云開發者論壇找到了網友提供的SDK,有興趣可以下載:釘釘非官方.Net SDK

另外,GitHub上還有官方的JQuery版免登開發Demo,可以參考:GitHub JQuery免登。

我參考的是.Net SDK,將其中的代碼,提取出了我所需要的部分,做了簡化處理。基本原理就是每次調用API都是發起HttpRequest,將結果做JSON反序列化。

核心代碼如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.IO;
  6 using Newtonsoft.Json;
  7 using Newtonsoft.Json.Linq;
  8 using DDApi.Model;
  9 
 10 namespace DDApi
 11 {
 12     public static class DDHelper
 13     {
 14         public static string GetAccessToken(string corpId, string corpSecret)
 15         {
 16             string url = string.Format("https://oapi.dingtalk.com/gettoken?corpid={0}&corpsecret={1}", corpId, corpSecret);
 17             try
 18             {
 19                 string response = HttpRequestHelper.Get(url);
 20                 AccessTokenModel oat = Newtonsoft.Json.JsonConvert.DeserializeObject<AccessTokenModel>(response);
 21 
 22                 if (oat != null)
 23                 {
 24                     if (oat.errcode == 0)
 25                     {
 26                         return oat.access_token;
 27                     }
 28                 }
 29             }
 30             catch (Exception ex)
 31             {
 32                 throw;
 33             }
 34             return string.Empty;
 35         }
 36 
 37         /* https://oapi.dingtalk.com/get_jsapi_ticket?access_token=79721ed2fc46317197e27d9bedec0425
 38          * 
 39          * errmsg    "ok"
 40          * ticket    "KJWkoWOZ0BMYaQzWFDF5AUclJOHgO6WvzmNNJTswpAMPh3S2Z98PaaJkRzkjsmT5HaYFfNkMdg8lFkvxSy9X01"
 41          * expires_in    7200
 42          * errcode    0
 43          */
 44         public static string GetJsApiTicket(string accessToken)
 45         {
 46             string url = string.Format("https://oapi.dingtalk.com/get_jsapi_ticket?access_token={0}", accessToken);
 47             try
 48             {
 49                 string response = HttpRequestHelper.Get(url);
 50                 JsApiTicketModel model = Newtonsoft.Json.JsonConvert.DeserializeObject<JsApiTicketModel>(response);
 51 
 52                 if (model != null)
 53                 {
 54                     if (model.errcode == 0)
 55                     {
 56                         return model.ticket;
 57                     }
 58                 }
 59             }
 60             catch (Exception ex)
 61             {
 62                 throw;
 63             }
 64             return string.Empty;
 65         }
 66 
 67         public static long GetTimeStamp()
 68         {
 69             TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
 70             return Convert.ToInt64(ts.TotalSeconds);
 71         }
 72 
 73         public static string GetUserId(string accessToken, string code)
 74         {
 75             string url = string.Format("https://oapi.dingtalk.com/user/getuserinfo?access_token={0}&code={1}", accessToken, code);
 76             try
 77             {
 78                 string response = HttpRequestHelper.Get(url);
 79                 GetUserInfoModel model = Newtonsoft.Json.JsonConvert.DeserializeObject<GetUserInfoModel>(response);
 80 
 81                 if (model != null)
 82                 {
 83                     if (model.errcode == 0)
 84                     {
 85                         return model.userid;
 86                     }
 87                     else
 88                     {
 89                         throw new Exception(model.errmsg);
 90                     }
 91                 }
 92             }
 93             catch (Exception ex)
 94             {
 95                 throw;
 96             }
 97             return string.Empty;
 98         }
 99 
100         public static string GetUserDetailJson(string accessToken, string userId)
101         {
102             string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", accessToken, userId);
103             try
104             {
105                 string response = HttpRequestHelper.Get(url);
106                 return response;
107             }
108             catch (Exception ex)
109             {
110                 throw;
111             }
112             return null;
113         }
114 
115         public static UserDetailInfo GetUserDetail(string accessToken, string userId)
116         {
117             string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", accessToken, userId);
118             try
119             {
120                 string response = HttpRequestHelper.Get(url);
121                 UserDetailInfo model = Newtonsoft.Json.JsonConvert.DeserializeObject<UserDetailInfo>(response);
122 
123                 if (model != null)
124                 {
125                     if (model.errcode == 0)
126                     {
127                         return model;
128                     }
129                 }
130             }
131             catch (Exception ex)
132             {
133                 throw;
134             }
135             return null;
136         }
137 
138         public static List<DepartmentInfo> GetDepartmentList(string accessToken, int parentId = 1)
139         {
140             string url = string.Format("https://oapi.dingtalk.com/department/list?access_token={0}", accessToken);
141             if (parentId >= 0)
142             {
143                 url += string.Format("&id={0}", parentId);
144             }
145             try
146             {
147                 string response = HttpRequestHelper.Get(url);
148                 GetDepartmentListModel model = Newtonsoft.Json.JsonConvert.DeserializeObject<GetDepartmentListModel>(response);
149 
150                 if (model != null)
151                 {
152                     if (model.errcode == 0)
153                     {
154                         return model.department.ToList();
155                     }
156                 }
157             }
158             catch (Exception ex)
159             {
160                 throw;
161             }
162             return null;
163         }
164     }
165 }

 1 using System.IO;
 2 using System.Net;
 3 
 4 namespace DDApi
 5 {
 6     public class HttpRequestHelper
 7     {
 8         public static string Get(string url)
 9         {
10             WebRequest request = HttpWebRequest.Create(url);
11             WebResponse response = request.GetResponse();
12             Stream stream = response.GetResponseStream();
13             StreamReader reader = new StreamReader(stream);
14             string content = reader.ReadToEnd();
15             return content;
16         }
17 
18         public static string Post(string url)
19         {
20             WebRequest request = HttpWebRequest.Create(url);
21             request.Method = "POST";
22             WebResponse response = request.GetResponse();
23             Stream stream = response.GetResponseStream();
24             StreamReader reader = new StreamReader(stream);
25             string content = reader.ReadToEnd();
26             return content;
27         }
28     }
29 }

HttpRequestHelperView Code

其中的Model,就不再一一貼出來了,大家可以根據官方文檔自己建立,這里只舉一個例子,即GetAccessToken的返回結果:

    public class AccessTokenModel
    {
        public string access_token { get; set; }

        public int errcode { get; set; }

        public string errmsg { get; set; }
    }

我創建了一個類DDApiService,將上述方法做了封裝:

using DDApi.Model;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Security.Cryptography;
using System.Text;

namespace DDApi
{
    /// <summary>
    ///
    /// </summary>
    public class DDApiService
    {
        public static readonly DDApiService Instance = new DDApiService();

        public string CorpId { get; private set; }
        public string CorpSecret { get; private set; }
        public string AgentId { get; private set; }

        private DDApiService()
        {
            CorpId = ConfigurationManager.AppSettings["corpId"];
            CorpSecret = ConfigurationManager.AppSettings["corpSecret"];
            AgentId = ConfigurationManager.AppSettings["agentId"];
        }

        /// <summary>
        /// 獲取AccessToken
        /// 開發者在調用開放平臺接口前需要通過CorpID和CorpSecret獲取AccessToken。
        /// </summary>
        /// <returns></returns>
        public string GetAccessToken()
        {
            return DDHelper.GetAccessToken(CorpId, CorpSecret);
        }

        public string GetJsApiTicket(string accessToken)
        {
            return DDHelper.GetJsApiTicket(accessToken);
        }

        public string GetUserId(string accessToken, string code)
        {
            return DDHelper.GetUserId(accessToken, code);
        }

        public UserDetailInfo GetUserDetail(string accessToken, string userId)
        {
            return DDHelper.GetUserDetail(accessToken, userId);
        }

        public string GetUserDetailJson(string accessToken, string userId)
        {
            return DDHelper.GetUserDetailJson(accessToken, userId);
        }

        public UserDetailInfo GetUserDetailFromJson(string jsonString)
        {
            UserDetailInfo model = Newtonsoft.Json.JsonConvert.DeserializeObject<UserDetailInfo>(jsonString);

            if (model != null)
            {
                if (model.errcode == 0)
                {
                    return model;
                }
            }
            return null;
        }

        public string GetSign(string ticket, string nonceStr, long timeStamp, string url)
        {
            String plain = string.Format("jsapi_ticket={0}&noncestr={1}&timestamp={2}&url={3}", ticket, nonceStr, timeStamp, url);

            try
            {
                byte[] bytes = Encoding.UTF8.GetBytes(plain);
                byte[] digest = SHA1.Create().ComputeHash(bytes);
                string digestBytesString = BitConverter.ToString(digest).Replace("-", "");
                return digestBytesString.ToLower();
            }
            catch (Exception e)
            {
                throw;
            }
        }

        public List<DepartmentInfo> GetDepartmentList(string accessToken, int parentId = 1)
        {
            return DDHelper.GetDepartmentList(accessToken, parentId);
        }
    }
}

DDApiService View Code

以上是底層核心部分。登錄頁面的實現在控制器DDController中,代碼如下:

using DDApi;
using DDApi.Model;
using System;
using System.Web.Mvc;

namespace AppointmentWebApp.Controllers
{
    public class DDController : Controller
    {
        //
        // GET: /DD/
        public ActionResult GetUserInfo(string accessToken, string code, bool setCurrentUser = true)
        {
            try
            {
                string userId = DDApiService.Instance.GetUserId(accessToken, code);
                string jsonString = DDApiService.Instance.GetUserDetailJson(accessToken, userId);
                UserDetailInfo userInfo = DDApiService.Instance.GetUserDetailFromJson(jsonString);
                if (setCurrentUser)
                {
                    Session["AccessToken"] = accessToken;
                    Session["CurrentUser"] = userInfo;
                }
                return Content(jsonString);
            }
            catch (Exception ex)
            {
                return Content(string.Format("{{'errcode': -1, 'errmsg':'{0}'}}", ex.Message));
            }
        }

        public ActionResult Login()
        {
            BeginDDAutoLogin();
            return View();
        }

        private void BeginDDAutoLogin()
        {
            string nonceStr = "helloDD";//todo:隨機
            ViewBag.NonceStr = nonceStr;
            string accessToken = DDApiService.Instance.GetAccessToken();
            ViewBag.AccessToken = accessToken;
            string ticket = DDApiService.Instance.GetJsApiTicket(accessToken);
            long timeStamp = DDHelper.GetTimeStamp();
            string url = Request.Url.ToString();
            string signature = DDApiService.Instance.GetSign(ticket, nonceStr, timeStamp, url);

            ViewBag.JsApiTicket = ticket;
            ViewBag.Signature = signature;
            ViewBag.NonceStr = nonceStr;
            ViewBag.TimeStamp = timeStamp;
            ViewBag.CorpId = DDApiService.Instance.CorpId;
            ViewBag.CorpSecret = DDApiService.Instance.CorpSecret;
            ViewBag.AgentId = DDApiService.Instance.AgentId;
        }
    }
}

DDController View Code

視圖View的代碼:

@{
    ViewBag.Title = "Login";
}
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <h2 id="notice">正在登錄...</h2>
    <script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript" src="http://g.alicdn.com/dingding/open-develop/1.5.1/dingtalk.js"></script>
    <script type="text/javascript">
        var _config = [];
        _config.agentId = "@ViewBag.AgentId";
        _config.corpId = "@ViewBag.CorpId";
        _config.timeStamp = "@ViewBag.TimeStamp";
        _config.nonceStr = "@ViewBag.NonceStr";
        _config.signature = "@ViewBag.Signature";

        dd.config({
            agentId: _config.agentId,
            corpId: _config.corpId,
            timeStamp: _config.timeStamp,
            nonceStr: _config.nonceStr,
            signature: _config.signature,
            jsApiList: ['runtime.info', 'biz.contact.choose',
                    'device.notification.confirm', 'device.notification.alert',
                    'device.notification.prompt', 'biz.ding.post',
                    'biz.util.openLink']
        });

        dd.ready(function () {
            dd.runtime.info({
                onSuccess: function (info) {
                    logger.e('runtime info: ' + JSON.stringify(info));
                },
                onFail: function (err) {
                    logger.e('fail: ' + JSON.stringify(err));
                }
            });

            dd.runtime.permission.requestAuthCode({
                corpId: _config.corpId,
                onSuccess: function (info) {//成功獲得code值,code值在info中  
                    //alert('authcode: ' + info.code);
                    //alert('token: @ViewBag.AccessToken');
                    /* 
                    *$.ajax的是用來使得當前js頁面和后臺服務器交互的方法 
                    *參數url:是需要交互的后臺服務器處理代碼,這里的userinfo對應WEB-INF -> classes文件中的UserInfoServlet處理程序 
                    *參數type:指定和后臺交互的方法,因為后臺servlet代碼中處理Get和post的doGet和doPost 
                    *原本需要傳輸的參數可以用data來存儲的,格式為data:{"code":info.code,"corpid":_config.corpid} 
                    *其中success方法和error方法是回調函數,分別表示成功交互后和交互失敗情況下處理的方法 
                    */
                    $.ajax({
                        url: '@Url.Action("GetUserInfo", "DD")?code=' + info.code + '&accessToken=@ViewBag.AccessToken',//userinfo為本企業應用服務器后臺處理程序  
                        type: 'GET',
                        /* 
                        *ajax中的success為請求得到相應后的回調函數,function(response,status,xhr) 
                        *response為響應的數據,status為請求狀態,xhr包含XMLHttpRequest對象 
                        */
                        success: function (data, status, xhr) {
                            alert(data);
                            var info = JSON.parse(data);
                            if (info.errcode != 0) {
                                alert(data);
                            } else {
                                //alert("當前用戶:" + info.name);
                                $('#notice').text("歡迎您:" + info.name + "。瀏覽器正在自動跳轉...");
                                location.href = "@Url.Action("Index", "Home")";
                            }
                        },
                        error: function (xhr, errorType, error) {
                            logger.e("嘗試獲取用戶信息失敗:" + info.code);
                            alert(errorType + ', ' + error);
                        }
                    });

                },
                onFail: function (err) {//獲得code值失敗  
                    alert('fail: ' + JSON.stringify(err));
                }
            });
        });
        dd.error(function (err) {
            alert('dd error: ' + JSON.stringify(err));
        });
    </script>
</body>
</html>

Login.cshtml View Code

其中nonstr理論上最好應該每次都隨機,留待讀者去完成吧:-)

釘釘免登就是這樣,只要弄懂了就會覺得其實不難,還順便理解了OAUTH。

后續改進

這個流程沒有考慮到AccessToken、JsApiTicket的有效期時間(2小時),因為整個過程就在一個頁面中都完成了。如果想要進一步擴展,多次調用api的話,需要考慮到上述有效期。

如果為了圖簡便每都去獲取AccessToken也是可以的,但是會增加服務器負擔,而且api的調用頻率是有限制的(1500次/s好像),所以應當采取措施控制。例如可以將AccessToken、JsApiTicket存放在this.HttpContext.Application["accessToken"]中,每次判斷有效期是否過期,如果過期就調用api重新申請一個。

以上就是這樣,感謝閱讀。


20170710編輯,更新mvc免登流程圖片,修正一處錯誤。

總結

以上是生活随笔為你收集整理的钉钉企业应用C#开发笔记之一(免登)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

最近最新mv字幕免费观看 | aaa免费毛片 | 婷婷黄色片 | 日本一区二区免费在线观看 | 亚洲精品一区二区在线观看 | 日韩大陆欧美高清视频区 | 欧美 日韩 国产 成人 在线 | 亚洲 精品在线视频 | 狠狠躁日日躁狂躁夜夜躁av | 国产精品永久免费观看 | 96精品高清视频在线观看软件特色 | 三级黄色免费 | 欧美一级片在线播放 | 国产免费观看视频 | 国产五月婷 | 欧美一级久久久 | 制服丝袜在线91 | 欧美激情综合五月色丁香小说 | 在线免费观看欧美日韩 | 国产成人在线播放 | 五月天丁香亚洲 | 日本精品va在线观看 | 国产在线永久 | 国产欧美在线一区二区三区 | 夜夜澡人模人人添人人看 | 韩国一区二区三区视频 | 欧美一级日韩免费不卡 | 亚洲精品在线观看网站 | 综合久久综合久久 | 人人玩人人添人人澡超碰 | www.福利| 日韩小视频网站 | 中文字幕在线观看网 | 亚洲电影影音先锋 | 97香蕉视频 | 日韩av中文在线观看 | 国产精品免费久久久久 | 日韩精品不卡 | av一区二区在线观看中文字幕 | 精品1区2区3区 | 国产精品久久久久久久久久免费看 | 91在线看| 国产一线天在线观看 | 热久久这里只有精品 | 天天操天天爱天天爽 | 精品国产一区二区三区免费 | 91天堂在线观看 | 亚洲精品成人av在线 | 亚洲精品久久久久久久蜜桃 | 国产自在线观看 | 一区精品在线 | 久久久久久久久久福利 | 亚洲午夜久久久久久久久久久 | 正在播放国产一区二区 | 日韩大片在线看 | 国产毛片久久 | 欧美韩国日本在线 | 国产福利在线 | 久精品视频在线 | 久久精品国产成人精品 | 亚洲精品乱码久久久久久蜜桃动漫 | 免费看十八岁美女 | 国产精品2区 | 91精品国产乱码久久桃 | 91激情小视频 | 91视频88av | 日韩免费一二三区 | 日韩羞羞| 欧美精品乱码久久久久久按摩 | 久久久久久久综合色一本 | 精品一区二区久久久久久久网站 | 久久精品女人毛片国产 | 五月的婷婷 | 一区二区三区高清 | 成人国产精品久久久 | 久草在线在线视频 | 97超级碰碰碰视频在线观看 | 高清有码中文字幕 | 午夜av在线免费 | 激情欧美xxxx | www.天天射.com | 日韩免费 | 黄色片免费电影 | 激情视频一区二区三区 | 特级西西www44高清大胆图片 | 久久亚洲综合国产精品99麻豆的功能介绍 | 蜜桃av综合网 | 亚洲一一在线 | 国产小视频你懂的 | 久久精品国产精品 | 99精品久久久久久久 | 成人影视片 | 国产午夜视频在线观看 | 成人91av| 日韩免费b | 免费91在线 | 操操爽| 日韩精品欧美专区 | www.狠狠插.com | 日韩精品久久久免费观看夜色 | 国内视频在线观看 | 精品国产综合区久久久久久 | 国产成人av一区二区三区在线观看 | 999日韩 | www色片 | 天天色天天操天天爽 | 日本成人中文字幕在线观看 | 中文字幕视频网 | 久久久国产电影 | 特黄特色特刺激视频免费播放 | 日韩系列在线观看 | 日韩经典一区二区三区 | 成年人在线看片 | 91黄色在线看| 精品夜夜嗨av一区二区三区 | 国产一区免费在线观看 | 特级黄色片免费看 | 麻豆传媒一区二区 | 久草在线免费色站 | 中文字幕在线观看播放 | 亚洲精品99久久久久中文字幕 | 欧美夫妻性生活电影 | a在线观看免费视频 | 国产精品久久伊人 | 久久久免费精品视频 | 国产一级精品在线观看 | 国产99在线免费 | 免费看三级黄色片 | 国产麻豆精品传媒av国产下载 | 国产精品一区二区三区在线免费观看 | 久久社区视频 | 日本性动态图 | 国产精品美乳一区二区免费 | 日韩视频免费观看高清完整版在线 | www.五月天 | 国产一区二区在线影院 | 日韩欧美视频免费观看 | 福利在线看片 | 免费a视频| 国产在线综合视频 | 亚洲女同videos | 最新的av网站 | 韩国av一区二区 | 97精品国产97久久久久久 | 久久在线视频精品 | 色亚洲网 | 日韩中文字幕免费视频 | 99精品国产免费久久久久久下载 | 天天干天天操av | 国产片免费在线观看视频 | a午夜在线| 久久久免费视频播放 | 97精品免费视频 | 日本性高潮视频 | 岛国av在线不卡 | 久久婷婷激情 | 久草在线资源观看 | 韩日精品视频 | 久久最新| 婷婷五天天在线视频 | 天天添夜夜操 | 91精品伦理 | 狠狠干免费 | 亚洲欧美日韩国产精品一区午夜 | 黄色天堂在线观看 | 日韩精品一区二区三区免费视频观看 | 精品嫩模福利一区二区蜜臀 | 亚洲专区中文字幕 | 亚洲精品久久视频 | 国产免费黄色 | 在线电影 一区 | 亚洲精品xx | 91大神一区二区三区 | 最新日韩在线观看视频 | 深夜福利视频一区二区 | 国产成本人视频在线观看 | 亚洲免费在线播放视频 | 欧美成人91 | 国产福利中文字幕 | 色婷婷天天干 | 国产亚洲精品久久久久久久久久 | 国产精品12345| 婷婷综合在线 | 国产精品理论在线观看 | 99人久久精品视频最新地址 | 日韩av线观看 | 欧美伦理一区二区 | 玖玖在线看 | 91桃花视频 | 中文字幕在线乱 | 国产精品视频免费 | 99视频播放 | 国产黄色大片 | www免费在线观看 | 免费观看成年人视频 | 久久99深爱久久99精品 | 国产一区二区高清不卡 | 黄网站免费大全入口 | 国产精品久久久久国产精品日日 | 欧美日韩精品在线免费观看 | 成年人在线播放视频 | 成人国产精品一区二区 | 国产亚洲在线 | 色综合久久精品 | 久久精品1区 | 久久久99国产精品免费 | 国产精品久久久久久久久久久久 | 香蕉视频网站在线观看 | 深爱婷婷久久综合 | 成人av免费在线播放 | av电影一区| 在线视频a | 久久久久国产一区二区三区四区 | 国产人成一区二区三区影院 | 国产精品乱码久久久久久1区2区 | 麻豆传媒视频在线播放 | 天天av综合网 | www.夜色.com| 中文在线8新资源库 | 亚洲高清视频在线观看免费 | 久草在线免费新视频 | 久久字幕精品一区 | 日日夜夜狠狠干 | 免费在线激情电影 | 天天做天天爱天天爽综合网 | 国产成人专区 | 亚洲清纯国产 | 国产精品美乳一区二区免费 | 国产视频在线看 | 狠狠躁18三区二区一区ai明星 | 1区2区视频| 天堂在线视频免费观看 | 91干干干| 三上悠亚在线免费 | 国产精品永久免费 | 国产午夜精品理论片在线 | 欧美激情精品久久久久久 | 欧美精品国产综合久久 | 欧美成人精品欧美一级乱 | 久久久99精品免费观看app | 免费在线黄网 | 久久视频国产精品免费视频在线 | 911久久香蕉国产线看观看 | 午夜精品一区二区三区视频免费看 | 午夜精品久久久久久久99 | 美女露久久 | 国内精品久久久久久中文字幕 | 九九亚洲精品 | 亚洲精品久久视频 | 国产精品免费视频久久久 | 色婷婷视频在线观看 | 色哟哟国产精品 | 一级免费片 | 免费精品人在线二线三线 | 久久精品国产亚洲a | 丁香久久综合 | 黄色国产成人 | 成人久久免费 | 波多野结衣在线观看视频 | 91色网址| 日韩va在线观看 | 成人日批视频 | 香蕉网在线 | 国内精品一区二区 | 伊人成人久久 | 九九久久影院 | 国产v在线观看 | 在线91av| 国产精品久久久久国产精品日日 | 一本一本久久a久久精品牛牛影视 | 在线va网站 | 国产精品毛片一区视频播不卡 | 69精品久久 | 999成人免费视频 | 天天操天天色天天射 | 色亚洲网 | 国产在线观看av | 亚洲乱码久久 | 日韩亚洲在线观看 | 亚洲精品乱码久久久久久写真 | 日韩欧美一区二区三区视频 | 亚洲黄色激情小说 | 精品成人网 | 国产亚洲精品久久久久久电影 | 久草亚洲视频 | 日本中文乱码卡一卡二新区 | 久久国产精品久久精品 | 九九亚洲精品 | 久草视频免费在线观看 | 黄色一级大片在线观看 | 国产中文字幕视频在线观看 | 婷婷在线资源 | 精品久久久久久久久亚洲 | 欧美性大战 | 美国av片在线观看 | 91精品一 | 黄网站免费久久 | 狠狠色丁香婷婷综合基地 | 特级西西444www高清大视频 | 欧美日韩高清在线 | 午夜在线资源 | 国产1区2| 久久久久久久久久电影 | av在线官网| www色网站 | 成人在线视频免费 | 久久久久久久久久久成人 | 久久免费精品 | 成人黄色电影在线观看 | 国产一区二区视频在线播放 | 国产成人精品一区二区三区 | 日韩a级免费视频 | 超碰97成人 | 91完整视频 | 99热这里只有精品久久 | 色综合久 | 精品一区二区免费视频 | 欧美色图另类 | www免费黄色| 91视频一8mav | 色无五月| 九九99 | 人人dvd | 色综合久久久 | 91手机在线看片 | 天天天天综合 | 特级毛片在线 | 国产精品成人一区二区三区 | 一区二区三区四区五区在线 | 久久影视网 | 国产视频不卡一区 | 日韩av在线看 | www.久久久com| 啪啪精品 | 九九视频一区 | 久久免费黄色 | 狠狠色丁香婷婷综合久久片 | 中文字幕首页 | 国产69精品久久99不卡的观看体验 | 涩涩网站在线观看 | 久久国产经典视频 | 婷婷av电影 | 国产色婷婷 | 欧美日韩另类在线观看 | 国产黑丝一区二区三区 | 97精品免费视频 | 亚洲第一久久久 | 精品二区久久 | 亚洲欧美日韩一级 | 人人射av | 玖玖在线资源 | 成人电影毛片 | 中文字幕一区二区三区四区在线视频 | 激情五月开心 | 成人精品久久 | 超碰97网站| 美女黄频免费 | 亚洲精品成人网 | 亚洲永久精品在线观看 | 国内精品久久天天躁人人爽 | 在线亚洲精品 | 国产美女精品人人做人人爽 | 成人亚洲欧美 | 久久电影国产免费久久电影 | 手机看片国产 | 天天干中文字幕 | 91香蕉视频色版 | 综合激情网 | 五月天欧美精品 | 日韩欧美精品在线视频 | 国产精品乱看 | 91在线视频免费观看 | 免费高清在线观看成人 | 最近中文字幕免费观看 | 久久草草影视免费网 | 免费99精品国产自在在线 | 天天色综合久久 | 四虎成人精品永久免费av | 亚洲精品欧洲精品 | 亚洲欧美在线综合 | 久草影视在线观看 | 中文字幕免费观看视频 | 中文字幕av最新 | 欧美九九视频 | 天天爱天天操天天干 | 午夜国产成人 | 日韩在线观看一区二区 | 亚洲免费专区 | 看av免费 | 久久免费黄色 | 国产色一区| 热99在线 | 丁香狠狠 | 在线播放亚洲激情 | 精品夜夜嗨av一区二区三区 | 午夜丁香网 | 中文成人字幕 | 91爱爱电影| 免费av视屏 | 国产精品99久久免费观看 | 欧美日一级片 | 欧洲一区二区在线观看 | 日韩在线播放欧美字幕 | 亚洲欧美日韩国产一区二区三区 | 国产超碰97 | 91少妇精拍在线播放 | 一区二区三区免费在线观看视频 | 精品三级av | 亚洲国内精品 | 伊人国产视频 | 欧洲精品视频一区二区 | 欧美日韩视频在线 | 久久免费视频在线观看 | 五月开心婷婷 | 黄色三级免费观看 | 性色av一区二区 | 天天艹天天爽 | 在线草| 日日夜夜人人精品 | 97超碰国产精品女人人人爽 | 91视频啪| 在线日韩一区 | 精品夜夜嗨av一区二区三区 | 1024手机在线看 | 国产在线观看xxx | 91天堂影院| 国产精品久久久久久久久久久杏吧 | av在线收看 | 免费一级片在线观看 | 午夜国产福利视频 | 高清av免费一区中文字幕 | 国产亚洲精品成人 | 激情丁香婷婷 | 日韩和的一区二在线 | 亚洲综合视频在线 | 国产一区二区日本 | 久草在线一免费新视频 | 视频二区在线 | 97视频网站 | 日韩三区在线观看 | 亚洲精品午夜国产va久久成人 | 天天色天 | 99在线精品视频在线观看 | 婷婷丁香在线视频 | 超碰在线最新网址 | 日产中文字幕 | 草久视频在线观看 | 日韩精品免费一区二区 | www激情com | 国产91精品一区二区麻豆亚洲 | 日日夜夜狠狠干 | 午夜视频一区二区 | 国产亚洲视频中文字幕视频 | 精品国产乱码久久久久久1区二区 | 天堂av网站 | 午夜在线看 | 日韩二三区 | 国产又粗又猛又爽又黄的视频先 | 99久久精品久久久久久动态片 | 国产三级精品三级在线观看 | 波多野结衣在线播放一区 | 在线观看一区二区精品 | 免费看成人片 | 久久精品国产一区二区三 | 国产成年免费视频 | 亚洲免费av片 | 免费观看一区二区三区视频 | 91影视成人 | 久久国产精品第一页 | 亚洲精品国偷拍自产在线观看 | 黄色aaa毛片| 午夜成人免费影院 | 精品久久九九 | 日p在线观看 | 日韩av电影中文字幕 | 天天综合亚洲 | 国模视频一区二区 | 西西444www大胆无视频 | 久久国产精品区 | 西西444www大胆无视频 | 91精品国产综合久久婷婷香蕉 | 欧美精品久久久久久久久老牛影院 | 国产成人精品不卡 | 成人性生交视频 | 日韩av视屏在线观看 | 91成人免费看片 | 亚洲视频 一区 | 在线观看深夜福利 | 免费一级特黄录像 | 久青草国产在线 | 91麻豆免费看 | 91成人精品在线 | 日日爽夜夜爽 | 国产小视频在线免费观看 | 久久免费资源 | 天堂资源在线观看视频 | 亚洲一级电影在线观看 | 国产视频在线观看一区 | 最新不卡av | 人人爽夜夜爽 | 亚洲狠狠婷婷 | 欧美三人交 | 久久久久 | 国产系列在线观看 | 久久亚洲综合色 | 青青河边草免费直播 | 天天操天天摸天天干 | 婷婷色 亚洲 | 欧美网址在线观看 | 亚洲永久精品在线 | 国产97在线视频 | 免费在线黄色av | 在线v片| 一区二区中文字幕在线 | 精品国产视频在线观看 | 91免费在线播放 | 九九视频免费在线观看 | 99久久精品一区二区成人 | 国产中文字幕视频 | 天天射天天色天天干 | 97国产精品免费 | 久草视频国产 | 国产精品一区二区久久久 | 国产精品嫩草69影院 | 亚洲九九九在线观看 | 日韩av在线网站 | ,午夜性刺激免费看视频 | 免费观看的av | 国产精品观看在线亚洲人成网 | 久久人人精 | 亚洲国产高清视频 | 亚洲 中文 欧美 日韩vr 在线 | 天天色天天射天天干 | 国产精品永久 | 久久公开免费视频 | 久久视频免费在线观看 | 久久综合久久八八 | 免费网站黄色 | 日韩精品高清视频 | 国产精品一二三 | 日韩在线视频不卡 | 成人av电影免费在线观看 | 精品一区二区综合 | 国产天天综合 | 国产免费av一区二区三区 | 高潮久久久久久 | 五月天激情综合网 | 国产无套一区二区三区久久 | 国产尤物在线视频 | 九九在线免费视频 | 国产精品麻豆99久久久久久 | 伊人射 | 麻豆果冻剧传媒在线播放 | 6080yy午夜一二三区久久 | 欧美另类视频 | 五月天婷亚洲天综合网鲁鲁鲁 | 久久天天躁狠狠躁夜夜不卡公司 | 日韩av片免费在线观看 | 久久久视屏 | 91精品国产乱码在线观看 | 狠狠操操 | 欧美,日韩 | 国产99在线 | 午夜精品成人一区二区三区 | 中文字幕亚洲欧美日韩 | 亚洲精品视频在线观看免费视频 | 天天操天天色综合 | 国产精品99久久久久人中文网介绍 | 日韩黄色软件 | 日本aaa在线观看 | 99免费观看视频 | 99久久精品国产亚洲 | 免费观看国产精品视频 | 欧美视频18 | 亚洲成人av电影在线 | 干天天| www.69xx| 精品国产一区二区三区久久久蜜臀 | 99视频一区二区 | 久久精品人 | 美女久久久 | 不卡av电影在线观看 | 九九精品视频在线看 | 亚洲欧美成人在线 | 婷婷视频在线观看 | 亚洲日本va午夜在线影院 | 欧美激情在线网站 | 亚洲精欧美一区二区精品 | 视频一区二区视频 | 亚洲精品午夜久久久久久久 | 美女av免费| 国产第一页在线观看 | 国产精品手机在线 | 激情欧美xxxx | 国产成人av片 | 在线精品在线 | 999色视频| 黄色小说视频网站 | 丰满少妇对白在线偷拍 | 久草在线观看视频免费 | 精品国产区 | 日本久久成人 | .国产精品成人自产拍在线观看6 | 中文字幕永久在线 | 欧美色婷婷| 懂色av懂色av粉嫩av分享吧 | 日韩在线视频一区 | 免费看一级特黄a大片 | 又黄又爽又色无遮挡免费 | 91精品国产综合久久婷婷香蕉 | 久久人人干 | 97电影在线观看 | 丁香五婷 | 中国一级特黄毛片大片久久 | 91精品中文字幕 | 亚洲乱码在线 | 日韩免费在线视频 | 成年人视频免费在线播放 | 日韩在线短视频 | 国产精品九色 | 五月激情电影 | 亚洲jizzjizz日本少妇 | 在线视频国产区 | 99在线热播精品免费99热 | 久草精品视频在线观看 | 五月婷婷中文字幕 | 国产成人av片| 99精品乱码国产在线观看 | 色国产在线 | 亚洲久久视频 | 成人在线免费观看视视频 | 婷婷丁香在线视频 | 一区二区在线不卡 | 日韩理论影院 | 色综合天 | 亚洲年轻女教师毛茸茸 | 国产成人免费高清 | 天天色天天操天天爽 | 超碰人人乐 | 日韩有码中文字幕在线 | 在线播放国产一区二区三区 | 国产美女免费看 | 麻豆av一区二区三区在线观看 | 丁香婷婷激情国产高清秒播 | 看国产黄色片 | 精品极品在线 | 成年人国产精品 | 开心激情网五月天 | 天天做日日做天天爽视频免费 | 日韩欧美精品在线观看视频 | 丝袜美女视频网站 | 国产麻豆视频 | 国产精品国产三级国产不产一地 | 啪啪肉肉污av国网站 | 欧美色图视频一区 | 外国av网 | 天天干天天射天天爽 | 五月婷婷综合网 | www免费视频com━ | 91在线资源 | 国产在线观看一 | 亚洲春色综合另类校园电影 | 99久久er热在这里只有精品66 | 日日干美女 | 国产伦精品一区二区三区无广告 | www.久久视频 | 最近中文字幕免费大全 | 午夜婷婷网 | 日韩在线首页 | 欧美夫妻性生活电影 | 夜夜操天天操 | 欧美久久久久久久久久久 | 色婷婷亚洲婷婷 | 久久视频这里有久久精品视频11 | 色综合久久综合 | 欧美精品一区二区三区四区在线 | 99在线热播精品免费99热 | 日本中文字幕视频 | 在线免费视频a | 黄色在线免费观看网址 | 天天色天天操天天爽 | 色婷婷色| 黄污网| 中文字幕亚洲综合久久五月天色无吗'' | 99av在线视频 | 欧美精品一区二区三区一线天视频 | 香蕉视频网站在线观看 | 久久久久国产a免费观看rela | 久久久久久久99 | 中文字幕第一 | 亚洲乱码在线观看 | 久一在线 | 精品久久一区二区 | 亚洲乱码在线观看 | 国产色久 | 久久精品导航 | 黄色精品国产 | 国产一区二区中文字幕 | 五月天.com| 天堂av免费在线 | 国产精品大尺度 | 人人干人人上 | 美女黄色网在线播放 | av一二三区 | 欧美日韩不卡一区二区三区 | 91精选| 日韩欧美网址 | 免费视频你懂的 | 午夜精品久久久久久久99 | 国产又粗又长又硬免费视频 | 国产不卡毛片 | 国产精品一区二区三区免费看 | 91亚色视频在线观看 | 日本不卡123 | 欧美日韩首页 | 99这里有精品| 色播六月天 | 国产精品乱码高清在线看 | 狠狠干夜夜操 | 亚洲午夜久久久久久久久久久 | 国产成人精品一区二区在线观看 | 免费视频久久久久久久 | 成人免费 在线播放 | 婷婷综合成人 | 久久爽久久爽久久av东京爽 | 在线观看aa | 成年人免费在线看 | 日日夜夜干 | 久久午夜网 | 中文成人字幕 | 国产老太婆免费交性大片 | 成人黄色在线看 | 久久精品国产免费观看 | 日本中文字幕在线视频 | 天天操天天操天天操天天操 | 国产精品99久久久精品 | 制服丝袜一区二区 | 96久久欧美麻豆网站 | 国产五月婷婷 | 天天操夜夜曰 | 亚洲精品久久久久久久不卡四虎 | 亚洲综合在线播放 | 91午夜精品 | 日韩国产欧美在线播放 | 丁香午夜婷婷 | 国产乱对白刺激视频在线观看女王 | 中文字幕人成乱码在线观看 | 91麻豆.com| 超碰.com| 免费视频97 | 国产精品 国产精品 | 日本精品视频网站 | 久久热亚洲 | 久久久婷 | 激情综合中文娱乐网 | 91麻豆.com| 久久人人爽人人爽人人片 | 国产精品久久久久久久久久尿 | 久久97精品| 波多野结衣在线观看视频 | av一区在线 | 中文字幕二区 | 亚洲成人中文在线 | 天天色天天骑天天射 | 日韩视频免费播放 | 久久综合免费视频影院 | 91成人精品观看 | 亚洲精品视频大全 | 超碰av在线播放 | 91视频在线国产 | 国产小视频免费在线网址 | 久久久久电影 | 免费视频你懂的 | 激情中文在线 | 久久久久免费网 | 亚洲精品视频在线 | 丰满少妇在线观看网站 | 99视频精品| 亚洲深爱激情 | 免费观看av网站 | 青青河边草免费观看 | 欧美成人91 | 91mv.cool在线观看 | 探花视频在线观看免费 | 亚洲精品久久视频 | 欧美久久99 | 丁香花中文在线免费观看 | 2022中文字幕在线观看 | 国产呻吟在线 | 亚洲人在线视频 | 色a在线观看 | 一本一道久久a久久精品 | 91免费看黄 | 黄色资源在线观看 | 成年性视频 | 91精品国产乱码久久桃 | 久久激情综合 | 国产欧美高清 | 成年人黄色在线观看 | 18网站在线观看 | 国产精品亚洲视频 | 久久精品96| 国内综合精品午夜久久资源 | 一区二区三区视频 | 一级黄视频 | 激情综合六月 | 成年人免费观看国产 | 色吊丝在线永久观看最新版本 | 在线观看成人毛片 | 婷婷激情五月综合 | 精品久久久免费视频 | 日韩中文字幕免费看 | 激情视频二区 | 天天爽夜夜爽人人爽一区二区 | 欧美午夜寂寞影院 | 成人免费在线网 | 亚洲视频免费 | 国产成人精品久久 | 日韩精品中文字幕一区二区 | 久热色超碰 | 99热99re6国产在线播放 | 免费观看的黄色 | 天天色天天射综合网 | 午夜久久影视 | 成人app在线免费观看 | 天天天天爱天天躁 | 国产色资源| 国产精品久久久久久久久久久免费 | 欧美污网站 | 国产精品欧美一区二区 | 亚洲一区二区三区精品在线观看 | 一区在线电影 | 免费高清国产 | 亚洲国产成人高清精品 | 五月婷婷丁香网 | 香蕉久久久久 | 久久久久久久久久久久影院 | 免费在线观看不卡av | 日韩1级片| 国产成人高清 | 亚洲女人av | 婷婷色在线播放 | 免费av大全| 97超视频免费观看 | 国产精品午夜在线 | 免费影视大全推荐 | 天天操天天射天天爱 | 91在线精品观看 | 日韩欧美视频免费看 | 97精品国自产拍在线观看 | 69国产盗摄一区二区三区五区 | 中文字幕在线播放日韩 | 国产精品成人国产乱一区 | 日韩欧美高清免费 | 日韩二区在线观看 | 久久不卡免费视频 | 亚洲第一成网站 | 亚洲乱码精品久久久久 | 午夜av日韩 | 在线日韩三级 | 天天干天天干天天干 | 国内外成人在线视频 | free,性欧美 九九交易行官网 | 日韩91在线 | 在线观看成人av | 国产高清 不卡 | 午夜av大片 | 国产精品99蜜臀久久不卡二区 | 一级黄色免费 | 五月天综合婷婷 | 激情欧美丁香 | 久久久亚洲网站 | 亚洲欧美精品一区二区 | www.黄色片网站 | 91av电影在线观看 | 天天综合网国产 | 中文字幕日韩有码 | 人人草人 | 欧美一级在线看 | 人人玩人人弄 | 亚洲国产精品va在线看黑人动漫 | 97视频免费在线 | 色999五月色 | 国产精品白丝av | 在线观看韩日电影免费 | 一区二区三区在线电影 | 看毛片的网址 | 在线成人小视频 | 成人香蕉视频 | 菠萝菠萝在线精品视频 | 欧美成人免费在线 | 久久久一本精品99久久精品 | av一区二区三区在线 | 国产99自拍| 成人av资源网 | 日韩高清片 | 婷婷丁香激情 | 在线中文字幕观看 | 天天干天天干天天干 | 久草热久草视频 | 人人要人人澡人人爽人人dvd | 91看片黄色 | 国内久久精品 | 激情婷婷六月 | 国产精品12345| 久久久久久久久久久高潮一区二区 | 免费99| 久久开心激情 | 久久激情五月激情 | 久久综合给合久久狠狠色 | 在线91精品 | 国产在线观看高清视频 | 色婷婷播放 | 亚洲欧美精品在线 | 51久久夜色精品国产麻豆 | 视频三区在线 | 成人黄色大片网站 | 91日韩精品| 在线观看的a站 | 在线观看国产高清视频 | 亚洲国产成人精品电影在线观看 | 99草视频在线观看 | 国产精品美女久久 | 99久久久久免费精品国产 | 久久精品国产亚洲a | 一区二区三区在线观看免费视频 | 麻豆av一区二区三区在线观看 | 四虎在线视频免费观看 | 美女久久久久久久久久久 | 人人添人人 | 国产精品18久久久久久久网站 | 伊人天天操| av一本久道久久波多野结衣 | 一区二区三区精品在线 | 美女精品 | 国产精品久久久久久久久久ktv | 五月综合久久 | 久久9视频 | 91.dizhi永久地址最新 | 日日夜夜天天人人 | 久久久久久精 | 91视频高清免费 | 免费av在线网| 亚洲乱码精品久久久 | 国产视频亚洲视频 | 激情久久五月天 | 天天干亚洲 | 国产91精品看黄网站 | 久久草在线视频国产 | 欧美一级视频一区 | 天天爱天天操天天爽 | 热九九精品 | 国产精品久久久久久久久毛片 | 欧美日韩免费观看一区=区三区 | 国产福利一区在线观看 | 久久成人久久 | 日韩久久精品一区二区三区下载 | 国产97在线视频 | 在线播放 亚洲 | 免费av网站观看 | 日韩欧美在线一区 | 日本字幕网 | 色婷婷综合久久久中文字幕 | 中文在线字幕观看电影 | 亚洲影视九九影院在线观看 | 精品免费在线视频 | 99热这里只有精品在线观看 | 日韩在线电影观看 | 亚洲欧洲视频 | 九九九热精品免费视频观看网站 | 毛片网站在线观看 | 久久婷婷色 | 国产一区观看 | 久久久久免费精品视频 | 三上悠亚一区二区在线观看 | 99免费观看视频 | 久久九九国产精品 | 久久伊人色综合 | 日韩在线欧美在线 | 天天撸夜夜操 | 日批网站在线观看 | 亚洲黄色a | 天堂网中文在线 | 色成人亚洲 | 婷婷六月综合网 | 久久国产精品久久精品 | 日韩免费电影 | 亚洲高清精品在线 | 狠狠操狠狠插 | 在线观看成人一级片 | 99国产视频 | av在线免费播放网站 | 精品国产欧美一区二区三区不卡 | 免费能看的黄色片 | 亚洲精品乱码久久久久 | 二区三区在线 | 国产一区视频导航 | 成人在线观看你懂的 |