成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

JWT是什么?Node中怎么實(shí)現(xiàn)JWT鑒權(quán)機(jī)制(淺析)

本篇文章帶大家聊聊關(guān)于后端JWT鑒權(quán)的相關(guān)原理和如何在Node中去使用,希望對(duì)大家有所幫助,謝謝。

JWT是什么?Node中怎么實(shí)現(xiàn)JWT鑒權(quán)機(jī)制(淺析)

node.js極速入門(mén)課程:進(jìn)入學(xué)習(xí)

【相關(guān)教程推薦:nodejs視頻教程】

一、為什么使用JWT

一種技術(shù)的出現(xiàn),就是彌補(bǔ)另一種技術(shù)的的缺陷。在JWT出現(xiàn)之前,Session 認(rèn)證機(jī)制需要配合 Cookie 才能實(shí)現(xiàn)。由于 Cookie 默認(rèn)不支持跨域訪問(wèn),所以,當(dāng)涉及到前端跨域請(qǐng)求后端接口的時(shí)候,需要做很多額外的配置,才能實(shí)現(xiàn)跨域 Session 認(rèn)證。

注意:

  • 當(dāng)前端請(qǐng)求后端接口不存在跨域問(wèn)題的時(shí)候,推薦使用 Session 身份認(rèn)證機(jī)制。
  • 當(dāng)前端需要跨域請(qǐng)求后端接口的時(shí)候,不推薦使用 Session 身份認(rèn)證機(jī)制,推薦使用 JWT 認(rèn)證機(jī)制

二、JWT是什么

JWT(英文全稱:JSON Web Token)是目前最流行的跨域認(rèn)證解決方案。本質(zhì)就是一個(gè)字符串書(shū)寫(xiě)規(guī)范,如下圖,作用是用來(lái)在用戶和服務(wù)器之間傳遞安全可靠的信息

JWT是什么?Node中怎么實(shí)現(xiàn)JWT鑒權(quán)機(jī)制(淺析)

在目前前后端分離的開(kāi)發(fā)過(guò)程中,使用token鑒權(quán)機(jī)制用于身份驗(yàn)證是最常見(jiàn)的方案,流程如下:

  • 服務(wù)器當(dāng)驗(yàn)證用戶賬號(hào)和密碼正確的時(shí)候,給用戶頒發(fā)一個(gè)令牌,這個(gè)令牌作為后續(xù)用戶訪問(wèn)一些接口的憑證
  • 后續(xù)訪問(wèn)會(huì)根據(jù)這個(gè)令牌判斷用戶是否有權(quán)限進(jìn)行訪問(wèn)

三、JWT工作原理

JWT是什么?Node中怎么實(shí)現(xiàn)JWT鑒權(quán)機(jī)制(淺析)

總結(jié):用戶的信息通過(guò) Token 字符串的形式,保存在客戶端瀏覽器中。服務(wù)器通過(guò)還原 Token 字符串的形式來(lái)認(rèn)證用戶的身份。

四、token的組成部分

Token,分成了三部分,頭部(Header)、載荷(Payload)、簽名(Signature),并以.進(jìn)行拼接。其中頭部和載荷都是以JSON格式存放數(shù)據(jù),只是進(jìn)行了編碼。格式如下:

Header.Payload.Signature
登錄后復(fù)制

下面是 JWT 字符串的示例:

Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNjQ0ODI3NzI2LCJleHAiOjE2NDQ4Mjc3NTZ9.gdZKg9LkPiQZIgNAZ1Mn14GQd9kZZua-_unwHQoRsKE
登錄后復(fù)制

注意:Bearer 是手動(dòng)添加的頭部信息,必須攜帶此信息才能解析token !

五、token的三個(gè)部分的含義

1. header

每個(gè)JWT都會(huì)帶有頭部信息,這里主要聲明使用的算法。聲明算法的字段名為alg,同時(shí)還有一個(gè)typ的字段,默認(rèn)JWT即可。以下示例中算法為HS256:

{ "alg": "HS256", "typ": "JWT" }
登錄后復(fù)制

因?yàn)镴WT是字符串,所以我們還需要對(duì)以上內(nèi)容進(jìn)行Base64編碼,編碼后字符串如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
登錄后復(fù)制

2. payload

載荷即消息體,這里會(huì)存放實(shí)際的內(nèi)容,也就是Token的數(shù)據(jù)聲明,例如用戶的idname,默認(rèn)情況下也會(huì)攜帶令牌的簽發(fā)時(shí)間iat,通過(guò)還可以設(shè)置過(guò)期時(shí)間,如下:

{     "sub": "1234567890",     "name": "CoderBin",     "iat": 1516239022 }
登錄后復(fù)制

同樣進(jìn)行Base64編碼后,字符串如下:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
登錄后復(fù)制

3. Signature

簽名是對(duì)頭部和載荷內(nèi)容進(jìn)行簽名,一般情況,設(shè)置一個(gè)secretKey,對(duì)前兩個(gè)的結(jié)果進(jìn)行HMACSHA25算法,公式如下:

Signature = HMACSHA256(base64Url(header)+.+base64Url(payload),secretKey)
登錄后復(fù)制

一旦前面兩部分?jǐn)?shù)據(jù)被篡改,只要服務(wù)器加密用的密鑰沒(méi)有泄露,得到的簽名肯定和之前的簽名不一致

六、JWT使用方式

客戶端收到服務(wù)器返回的 JWT 之后,通常會(huì)將它儲(chǔ)存在 localStoragesessionStorage 中。

此后,客戶端每次與服務(wù)器通信,都要帶上這個(gè) JWT 的字符串,從而進(jìn)行身份認(rèn)證。推薦的做法是把 JWT 放在 HTTP 請(qǐng)求頭的 Authorization 字段中,格式如下:

Authorization: Bearer <token>
登錄后復(fù)制

七、JWT實(shí)現(xiàn)

Token 的使用分成了兩部分:

  • 生成token:登錄成功的時(shí)候,頒發(fā)token
  • 驗(yàn)證token:訪問(wèn)某些資源或者接口時(shí),驗(yàn)證token

接下來(lái)就在 node+express 環(huán)境下帶大家實(shí)現(xiàn)jwt鑒權(quán),最后有完整代碼加注釋,可以直接看最后的代碼

1. 安裝 JWT 相關(guān)的包

運(yùn)行如下命令,安裝如下兩個(gè) JWT 相關(guān)的包:

npm i jsonwebtoken express-jwt
登錄后復(fù)制

其中:

  • jsonwebtoken 用于生成 JWT 字符串
  • express-jwt 用于驗(yàn)證token,將 JWT 字符串解析還原成 JSON 對(duì)象

2. 導(dǎo)入 JWT 相關(guān)的包

app.js

// 導(dǎo)入用于生成 JWT 字符串的包 const jwt = require('jsonwebtoken')  // 導(dǎo)入用戶將客戶端發(fā)送過(guò)來(lái)的 JWT 字符串,解析還原成 JSON 對(duì)象的包 const expressJWT = require('express-jwt')
登錄后復(fù)制

3. 定義 secret 密鑰 *

為了保證 JWT 字符串的安全性,防止 JWT 字符串在網(wǎng)絡(luò)傳輸過(guò)程中被別人破解,我們需要專門(mén)定義一個(gè)用于加密解密的 secret 密鑰:

  • 當(dāng)生成 JWT 字符串的時(shí)候,需要使用 secret 密鑰對(duì)用戶的信息進(jìn)行加密,最終得到加密好的 JWT 字符串

  • 當(dāng)把 JWT 字符串解析還原成 JSON 對(duì)象的時(shí)候,需要使用 secret 密鑰進(jìn)行解密

// 這個(gè) secretKey 的是可以是任意的字符串 const secretKey = 'CoderBin ^_^'
登錄后復(fù)制

4. 在登錄成功后生成 JWT 字符串 *

調(diào)用 jsonwebtoken 包提供的 sign() 方法,將用戶的信息加密成 JWT 字符串,響應(yīng)給客戶端:

  • 參數(shù) 1:用戶的信息對(duì)象
  • 參數(shù) 2:解密的秘鑰
  • 參數(shù) 3:配置對(duì)象,可以配置 token 的有效期

注意:千萬(wàn)不要把密碼加密到 token 字符串中!

// 登錄接口 app.post('/api/login', function (req, res) {   // 將 req.body 請(qǐng)求體中的數(shù)據(jù),轉(zhuǎn)存為 userinfo 常量   const userinfo = req.body   // 省略登錄失敗情況下的代碼...     // 登錄成功   // 在登錄成功之后,調(diào)用 jwt.sign() 方法生成 JWT 字符串。并通過(guò) token 屬性發(fā)送給客戶端   const tokenStr = jwt.sign(     { username: userinfo.username },      secretKey,      { expiresIn: '30s' }   )      // 向客戶端響應(yīng)成功的消息   res.send({     status: 200,     message: '登錄成功!',     token: tokenStr // 要發(fā)送給客戶端的 token 字符串   }) })
登錄后復(fù)制

5. 將 JWT 字符串還原為 JSON 對(duì)象 *

客戶端每次在訪問(wèn)那些有權(quán)限接口的時(shí)候,都需要主動(dòng)通過(guò)請(qǐng)求頭中的 Authorization 字段,將 Token 字符串發(fā)送到服務(wù)器進(jìn)行身份認(rèn)證。

此時(shí),服務(wù)器可以通過(guò) express-jwt 這個(gè)中間件,自動(dòng)將客戶端發(fā)送過(guò)來(lái)的 Token 解析還原成 JSON 對(duì)象:

  • express.JWT({ secret: secretKey, algorithms: ['HS256'] }) 就是用來(lái)解析 Token 的中間件
  • express-jwt 模塊,現(xiàn)在默認(rèn)為 6版本以上,必須加上: algorithms: ['HS256']

注意:只要配置成功了 express-jwt 這個(gè)中間件,就會(huì)自動(dòng)把解析出來(lái)的用戶信息,掛載到 req.user 屬性上

// 1. 使用 app.use() 來(lái)注冊(cè)中間件 app.use(expressJWT({    secret: secretKey,    algorithms: ['HS256']  }).unless({ path: [/^/api//] }))
登錄后復(fù)制

注意

  • secret 必須和 sign 時(shí)候保持一致
  • 可以通過(guò) unless 配置接口白名單,也就是哪些 URL 可以不用經(jīng)過(guò)校驗(yàn),像登陸/注冊(cè)都可以不用校驗(yàn)
  • 校驗(yàn)的中間件需要放在需要校驗(yàn)的路由前面,無(wú)法對(duì)前面的 URL 進(jìn)行校驗(yàn)

6. 使用 req.user 獲取用戶信息

當(dāng) express-jwt 這個(gè)中間件配置成功之后,即可在那些有權(quán)限的接口中,使用 req.user 對(duì)象,來(lái)訪問(wèn)從 JWT 字符串中解析出來(lái)的用戶信息了,示例代碼如下:

// 這是一個(gè)有權(quán)限的 API 接口,必須在 Header 中攜帶 Authorization 字段,值為 token,才允許訪問(wèn) app.get('/admin/getinfo', function (req, res) {   // TODO_05:使用 req.user 獲取用戶信息,并使用 data 屬性將用戶信息發(fā)送給客戶端   console.log(req.user);   res.send({     status: 200,     message: '獲取用戶信息成功!',     data: req.user // 要發(fā)送給客戶端的用戶信息   }) })
登錄后復(fù)制

7. 捕獲解析 JWT 失敗后產(chǎn)生的錯(cuò)誤

當(dāng)使用 express-jwt 解析 Token 字符串時(shí),如果客戶端發(fā)送過(guò)來(lái)的 Token 字符串過(guò)期或不合法,會(huì)產(chǎn)生一個(gè)解析失敗的錯(cuò)誤,影響項(xiàng)目的正常運(yùn)行。我們可以通過(guò) Express 的錯(cuò)誤中間件,捕獲這個(gè)錯(cuò)誤并進(jìn)行相關(guān)的處理,示例代碼如下:

app.use((err, req, res, next) => {   // 這次錯(cuò)誤是由 token 解析失敗導(dǎo)致的   if (err.name === 'UnauthorizedError') {     return res.send({       status: 401,       message: '無(wú)效的token'     })   }   res.send({     status: 500,     message: '未知的錯(cuò)誤'   }) })
登錄后復(fù)制

8. 完整代碼

app.js

// 導(dǎo)入 express 模塊 const express = require('express') // 創(chuàng)建 express 的服務(wù)器實(shí)例 const app = express()  // TODO_01:安裝并導(dǎo)入 JWT 相關(guān)的兩個(gè)包,分別是 jsonwebtoken 和 express-jwt const jwt = require('jsonwebtoken') const expressJWT = require('express-jwt')   // 允許跨域資源共享 const cors = require('cors') app.use(cors())  // 解析 post 表單數(shù)據(jù)的中間件 const bodyParser = require('body-parser') // 這里用內(nèi)置的中間件也行: app.use(express.urlencoded({ extended: false })) app.use(bodyParser.urlencoded({ extended: false }))  // TODO_02:定義 secret 密鑰,建議將密鑰命名為 secretKey // 這個(gè) secretKey 的是可以是任意的字符串 const secretKey = 'smiling ^_^'  // TODO_04:注冊(cè)將 JWT 字符串解析還原成 JSON 對(duì)象的中間件 // 1. 使用 app.use() 來(lái)注冊(cè)中間件 // 2. express.JWT({ secret: secretKey, algorithms: ['HS256'] }) 就是用來(lái)解析 Token 的中間件 // 2.1 express-jwt 模塊,現(xiàn)在默認(rèn)為 6版本以上,必須加上: algorithms: ['HS256'] // 3. .unless({ path: [/^/api//] }) 用來(lái)指定哪些接口不需要訪問(wèn)權(quán)限 // 4. 注意:只要配置成功了 express-jwt 這個(gè)中間件,就會(huì)自動(dòng)把解析出來(lái)的用戶信息,掛載到 req.user 屬性上 app.use(expressJWT({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [/^/api//] }))  // 登錄接口 app.post('/api/login', function (req, res) {   // 將 req.body 請(qǐng)求體中的數(shù)據(jù),轉(zhuǎn)存為 userinfo 常量   const userinfo = req.body   // 登錄失敗   if (userinfo.username !== 'admin' || userinfo.password !== '000000') {     return res.send({       status: 400,       message: '登錄失敗!'     })   }   // 登錄成功   // TODO_03:在登錄成功之后,調(diào)用 jwt.sign() 方法生成 JWT 字符串。并通過(guò) token 屬性發(fā)送給客戶端   // 參數(shù) 1:用戶的信息對(duì)象   // 參數(shù) 2:解密的秘鑰   // 參數(shù) 3:配置對(duì)象,可以配置 token 的有效期   // 記住:千萬(wàn)不要把密碼加密到 token 字符串中!   const tokenStr = jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '30s' })   res.send({     status: 200,     message: '登錄成功!',     token: tokenStr // 要發(fā)送給客戶端的 token 字符串   }) })  // 這是一個(gè)有權(quán)限的 API 接口,必須在 Header 中攜帶 Authorization 字段,值為 token,才允許訪問(wèn) app.get('/admin/getinfo', function (req, res) {   // TODO_05:使用 req.user 獲取用戶信息,并使用 data 屬性將用戶信息發(fā)送給客戶端   console.log(req.user);   res.send({     status: 200,     message: '獲取用戶信息成功!',     data: req.user // 要發(fā)送給客戶端的用戶信息   }) })  // TODO_06:使用全局錯(cuò)誤處理中間件,捕獲解析 JWT 失敗后產(chǎn)生的錯(cuò)誤 app.use((err, req, res, next) => {   // 這次錯(cuò)誤是由 token 解析失敗導(dǎo)致的   if (err.name === 'UnauthorizedError') {     return res.send({       status: 401,       message: '無(wú)效的token'     })   }   res.send({     status: 500,     message: '未知的錯(cuò)誤'   }) })  // 調(diào)用 app.listen 方法,指定端口號(hào)并啟動(dòng)web服務(wù)器 app.listen(8888, function () {   console.log('Express server running at http://127.0.0.1:8888') })
登錄后復(fù)制

八. 測(cè)試結(jié)果

1 測(cè)試登錄接口

借助 postman 工具測(cè)試接口

JWT是什么?Node中怎么實(shí)現(xiàn)JWT鑒權(quán)機(jī)制(淺析)

2. 測(cè)試登錄需要權(quán)限的接口-失敗

JWT是什么?Node中怎么實(shí)現(xiàn)JWT鑒權(quán)機(jī)制(淺析)

3. 測(cè)試登錄需要權(quán)限的接口-成功

JWT是什么?Node中怎么實(shí)現(xiàn)JWT鑒權(quán)機(jī)制(淺析)

九、最后總結(jié)

JWT鑒權(quán)機(jī)制有許多優(yōu)點(diǎn):

  • json具有通用性,所以可以跨語(yǔ)言
  • 組成簡(jiǎn)單,字節(jié)占用小,便于傳輸
  • 服務(wù)端無(wú)需保存會(huì)話信息,很容易進(jìn)行水平擴(kuò)展
  • 一處生成,多處使用,可以在分布式系統(tǒng)中,解決單點(diǎn)登錄問(wèn)題
  • 可防護(hù)CSRF攻擊

當(dāng)然,不可避免的也有一些缺點(diǎn):

  • payload部分僅僅是進(jìn)行簡(jiǎn)單編碼,所以只能用于存儲(chǔ)邏輯必需的非敏感信息
  • 需要保護(hù)好加密密鑰,一旦泄露后果不堪設(shè)想
  • 為避免token被劫持,最好使用https協(xié)議

本次的淺析JWT鑒權(quán)機(jī)制就講到這里,希望對(duì)大家有所幫助,謝謝!

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
国产乱人伦AⅤ在线麻豆A| 国产VIDEOSSEX精品| 亚洲鲁丝片一区二区三区| 精品高朝久久久久9999| 国产成人精品综合久久久| 被黑人下药做得受不了| 99在线精品视频高潮喷吹| 一本大道色婷婷在线| 亚洲成A人片在线观看无码不卡| 无码人妻ΑⅤ免费一区二区三区 | 欧美 丝袜 自拍 制服 另类| 国产人成视频在线观看| 国产成人AV综合亚洲色欲| 国产无遮挡18禁无码网站免费| 国产99久久久国产精品~~牛| 草莓丝瓜向日葵黄瓜榴莲IOS| JJZZJJZZ高潮喷水妇女| 18禁止免费观看试看免费大片| 曰批免费视频播放免费| 伊人色综合网一区二区三区| 一二三四在线看日本高清| 已婚丰满少妇潮喷21P| WWW性久久久COM| ZOOM与人性ZOOM怎么同步| 国产成人最新三级在线视频| 国产成人综合一区人人| 久久精品岛国AV一区二区无码| 久久国产精品99久久人人澡 | 公交车上荫蒂添的好舒服口述小说| 国产午夜无码片在线观看影院| 国产老妇伦国产熟女老妇高清97| 久久久国产精品消防器材| 久久久久久久精品免费久精品蜜桃| 久久久精品人妻一区二区三区GV| 欧美精品免费观看二区| 青青青国产手线观看视频2019| 人马畜禽CORPORATION| 无人区码一码二码三MBA| 亚洲AV无码成人精品网站漏男| 亚洲AV日韩精品久久久久| 亚洲国产精品久久久久4婷婷| 亚洲无亚洲人成网站77777| 一本大道久久精品 东京热 | 人妻熟妇与黑人HDXⅩXX| 日韩A级成人免费无码视频| 色噜噜狠狠色综合成人网| 体验区试看120秒啪啪免费| 无码人妻啪啪一区二区| 在厨房被C到高潮A毛片奶水| 99精品国产兔费观看久久99| FREE性欧美18ⅩXOO极品| 成人性欧美丨区二区三区| 国产成人午夜在线视频A站| 国偷自产一区二区免费视频| 九九真实偷窥短视频| 麻豆星空传媒果冻传媒大象| 欧美白人乱大交XXXX潮喷| 学生无码AV一区二区三区| 亚洲中字幕日产2021草莓| …日韩人妻无码精品一专区| 国产精品天干天干在线观看澳门 | 亚洲中文字幕无码第一区| 嗯啊开小嫩苞好深啊H视频| 国产乱子伦视频一区二区三区| 国产亚洲精品岁国产微拍精品| 欧美黑人性暴力猛交喷水| 亚洲VA中文字幕无码一区| 又粗又大又硬毛片免费看| 国产精品久久久久国产A级| 精品国产乱码久久久久久郑州公司 | 超碰CAO已满18进入| 久久精品国产亚洲AV麻豆图片| 深田えいみ禁欲后被隔壁人妻| 玩爽少妇人妻系列无码| 亚洲欧美国产免费综合视频| 成人片黄网站色多多WWW| 巨胸美乳无码人妻在线| 人妻少妇精品无码专区漫画| 天天爱天天做天天爽| 亚洲精品卡2卡3卡4卡5卡区 | 老司机久久99久久精品播放免费 | JIJZZIZZ老师出水喷水多| 久久精品夜色噜噜亚洲A∨| 午马视频影院1区2区3区4区| 一本加勒比HEZYO无码专区| 国产强被迫伦姧在线观看无码| 清一区二区国产好的精华液| 野花韩国视频观看免费高清的| JAPANESE人妻少妇HD| 久久久久久A亚洲欧洲AV冫| 亚洲AV成人片无码www小说| 资源在线WWW天堂官网| 国产成人MV视频在线观看| 欧美粗大强交18P直喷水| 野花社区韩国视频WWW了| 国产在线清纯极品美女援交| 欧美操逼视频网站| 一本加勒比HEZYO无码人妻| 激情欧美成人小说在线视频| 欧美性战A久久久久久| 亚洲AV无码一区二区三区网站| 97夜夜澡人人爽人人喊A| 久久久无码精品亚洲日韩蜜臀浪潮 | 欧美巨大XXXX做受中文字幕| 性欧美长视频免费观看不卡 | 蜜桃AV一区二区三区| 天堂影院在线观看高清在线| 差差差很疼视频30分钟应用| 欧美肥肥婆另类XXXX000| 中文字幕亚洲欧美日韩在线不卡| 久久久精品国产SM调教网站| 亚洲国产欧美国产综合久久| 成人国内精品久久久久影院VR| 久久精晶国产99久久6| 亚洲成AV人最新无码| 国产亚洲精品A在线观看APP| 无码人妻啪啪一区二区| 国产精品久久国产精品99盘| 四季亚洲精品成人AV无码网站| 第一福利视频500| 老师上课跳D突然被开到最大视频| 亚洲情文字幕在线一区| 国产H视频在线观看| 色欲人妻Av一二区二区三区| 2022久久国产精品免费热麻豆 | 亚洲AV永久无码精品一福利| 国产无人区二卡三卡四卡不见星空| 无套内谢孕妇毛片免费看看| 国产乱码字幕精品高清AV | 日本老熟妇人妻妇毛多多| 亚洲资源AV无码日韩AV无码| 久久国产精品77777| 亚洲影院丰满少妇中文字幕无码| 久久久99精品成人片| 一女三黑人玩4P惨叫| 麻豆熟妇人妻XXXXXX| 18禁亲胸揉胸膜下刺激免费网站| 免费女人高潮流视频在线观看| 亚洲AV永久精品无码桃色| 饥渴少妇AV无码影片| 亚洲欧美日韩国产成人精品影院| 久久精品国产亚洲AV麻豆长发 | 男女无遮挡猛进猛出免费观看视频| 亚洲成AV人片在线观看无线 | 艳妇乳肉豪妇荡乳XXX| 军人边走边吮她的花蒂| 2023极品少妇XXXO露脸| 欧美亚洲日韩国产区三| 大BBW大BBW超大BBW| 无码免费无线观看在线视频| 果冻传媒免费观看4399| 亚洲人成线无码7777| 国产男女猛烈无遮挡免费视频| 亚洲AⅤ日韩久久久久久| 精品少妇无码AV无码专区| 香港三日本三级少妇三级视频 | 精品人妻一区二区三区四区在线| 亚洲一二三四2021不卡| 免费的最近直播比较火的黄台 | 在厨房我撕开岳的丁字裤| 欧洲熟妇色XXXXX视频| …日韩人妻无码精品一专区| 青草草97久热精品视频| 国产99视频精品免费视看6| 亚洲AV无码国产一区二区三区四 | 吃奶呻吟打开双腿做受视频免费| 欧美极品小妇另类xXXX性| 成年无码动漫AV片在线尤物 | 国产精品人人做人人爽| 亚洲精品TV久久久久久久久久 | 40岁成熟女人牲交片20分钟| 日韩精品一区二区三区在线观看L 日韩精品一区二区三区在线观看 日韩精品一区二区三区影院 | 无人区一码二码乱码区别在哪| 好爽…又高潮了免费毛片| 性色欲情网站IWWW九文堂| 久久久久国产精品熟女影院| FREE性熟女妓女TUBE| 无码免费毛片手机在线无卡顿| 久久大香伊蕉在人线国产H| ASS黑森林PIC| 强插女教师AV在线| 国产毛片精选好视频| 野花日本大全免费观看版动漫 | 久久久久人妻精品区一| 边做边爱完整版免费视频播放| 人妻丰满熟妇AV无码处处不卡| 国产精品色视频ⅩXXX| 泳池里强摁做开腿呻吟漫画视频| 日本人妻丰满熟妇久久久久久 | 俄罗斯VIDEODESEXO极| 亚洲国产精品高清久久久| 欧美成人片在线观看网站| 国产精品国产三级国产AV浪潮 | 强行挺进美艳老师的后臀| 国产乱人伦精品一区二区在线观看| 永久黄网站免费视频性色| 色综合色欲色综合色综合色综合R| 久久国产精品娇妻素人| 大杳蕉在线影院在线播放| 野花日本大全免费观看10电影|