亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

從Token到接口權(quán)限:Java后端微信API對(duì)接的權(quán)限控制實(shí)戰(zhàn)

從Token到接口權(quán)限:Java后端微信API對(duì)接的權(quán)限控制實(shí)戰(zhàn) 微信API對(duì)接這件事做Java后端的朋友應(yīng)該都有體會(huì)半數(shù)以上的聯(lián)調(diào)事故最后都出在Token上。不是微信返回的錯(cuò)誤碼看不懂而是自己這套權(quán)限體系在并發(fā)、續(xù)期、多端登錄面前先垮了。我前后接過公眾號(hào)、小程序、企業(yè)微信第三方應(yīng)用從單機(jī)內(nèi)存緩存到分布式Redis從裸Token到JWT再到雙Token續(xù)簽踩過的坑攢了不少。這篇就把微信API開發(fā)里Java后端的接口權(quán)限控制和Token管理完整梳理一遍很多細(xì)節(jié)是官方文檔不寫、但線上環(huán)境一定會(huì)遇到的。1. 微信API對(duì)接中你面對(duì)的根本不是一種Token先把三種身份憑證分清楚很多人做微信開發(fā)時(shí)把Token當(dāng)成一個(gè)籠統(tǒng)概念這是后續(xù)所有混亂的根源。實(shí)際上在微信API場景下Java后端至少要管理三類完全不同的憑證它們的生命周期、存儲(chǔ)位置、失效策略各不相同。1.1 平臺(tái)級(jí)全局憑證公眾號(hào)/小程序的access_token這一類是微信開放平臺(tái)發(fā)放的全局調(diào)用憑證公眾號(hào)和小程序都有調(diào)用任何業(yè)務(wù)接口發(fā)消息、上傳素材、生成二維碼、獲取用戶列表等都必須攜帶它。特點(diǎn)是全局唯一、有效期7200秒兩小時(shí)、每天有調(diào)用次數(shù)上限公眾號(hào)是2000次通過IP白名單等方式可以提升到更高額度。關(guān)鍵點(diǎn)在于全局唯一。整個(gè)應(yīng)用只有一個(gè)access_token所有服務(wù)器節(jié)點(diǎn)、所有線程都要共享同一個(gè)值。如果你用本地內(nèi)存緩存每個(gè)節(jié)點(diǎn)各拿各的就會(huì)出現(xiàn)我這臺(tái)機(jī)器調(diào)接口成功、那臺(tái)機(jī)器調(diào)接口報(bào)40001的詭異現(xiàn)象。我在下面的章節(jié)會(huì)專門講緩存策略這里先記住一個(gè)結(jié)論微信的access_token必須是全局共享的Java后端一定要用Redis或類似中間件統(tǒng)一存放不能用JVM內(nèi)存。1.2 用戶級(jí)身份憑證網(wǎng)頁授權(quán)access_token/用戶憑證公眾號(hào)網(wǎng)頁授權(quán)、小程序登錄流程中用戶在授權(quán)后會(huì)拿到一個(gè)用戶維度的憑證。公眾號(hào)的網(wǎng)頁授權(quán)access_token有效期更短默認(rèn)7200秒刷新用的refresh_token有效期長達(dá)30天而且每次刷新會(huì)作廢舊的refresh_token。小程序側(cè)的session_key則完全不公開給前端由code換回后只能保存在后端。這類憑證有個(gè)特點(diǎn)它和某個(gè)具體用戶綁定不是全局共享的。你可以把它存在Redis里key用userId維度設(shè)計(jì)設(shè)置與微信側(cè)一致的過期時(shí)間。很多人在這一步犯的錯(cuò)是把用戶憑證和平臺(tái)憑證放在一起統(tǒng)一管理過期策略混用最后用戶明明還登錄著后端刷新時(shí)卻拿不到合法憑證去換新的導(dǎo)致所有用戶集體掉線。1.3 自建系統(tǒng)登錄態(tài)你的應(yīng)用自己的Token第三類是你在自己的Java后端里簽發(fā)的登錄態(tài)Token跟前兩類無關(guān)。用戶通過微信授權(quán)后你的后端確認(rèn)了用戶身份然后自己發(fā)一個(gè)Token給前端后續(xù)所有請(qǐng)求都帶這個(gè)Token來訪問你的業(yè)務(wù)接口。這一類才是你在代碼里完全掌控的東西也是接口權(quán)限控制的主要抓手。我見過很多項(xiàng)目把這三類混為一談拿微信的access_token當(dāng)前端登錄態(tài)用的有拿session_key當(dāng)業(yè)務(wù)Token用的也有還有的自建Token直接照搬了微信7200秒的過期策略導(dǎo)致用戶每小時(shí)被迫重新登錄一次。正確的做法是三層隔離微信平臺(tái)憑證只用于后端調(diào)用微信API微信用戶憑證只用于換取用戶信息自建Token只用于你自家系統(tǒng)的會(huì)話管理。哪怕它們都叫Token存儲(chǔ)、續(xù)期、失效處理也要分開。2. 自建Token機(jī)制的設(shè)計(jì)取舍JWT、不透明Token和雙Token續(xù)簽自建Token是Java后端權(quán)限控制的基石但選型時(shí)很多人直接跟風(fēng)上了JWT或者干脆UUID一把梭上線后才發(fā)現(xiàn)問題。這套體系的核心指標(biāo)其實(shí)就三個(gè)可撤銷性、過期控制粒度、存儲(chǔ)開銷。2.1 JWT的適用邊界無狀態(tài)是優(yōu)點(diǎn)也是撤銷難的根源JWTJSON Web Token這幾年在Java圈熱度很高尤其是配合Spring Security的OAuth2體系。它最大的優(yōu)點(diǎn)是服務(wù)端無狀態(tài)Token本身攜帶用戶信息、角色、過期時(shí)間校驗(yàn)時(shí)只需要驗(yàn)簽不需要查數(shù)據(jù)庫或Redis。但微信API場景下JWT有一個(gè)致命軟肋無法主動(dòng)撤銷。用戶注銷、被踢下線、管理員封禁賬號(hào)時(shí)只要Token還沒過期且簽名合法服務(wù)端就無法拒絕它。典型的妥協(xié)方案是引入Token黑名單Redis里存一份已撤銷Token的標(biāo)識(shí)但這就等于把狀態(tài)又引入了無狀態(tài)的優(yōu)勢大打折扣。我在一個(gè)電商小程序項(xiàng)目里用過純JWT方案運(yùn)營后臺(tái)封禁一個(gè)惡意用戶后那家伙的Token還能再合法調(diào)用接口最多30分鐘直到我們把黑名單邏輯補(bǔ)上才解決。2.2 不透明Token一切盡在掌握中的常規(guī)選擇所謂不透明Token就是服務(wù)端生成一個(gè)隨機(jī)字符串UUID或SecureRandom生成存Rediskey是Token值value是用戶信息和權(quán)限快照過期時(shí)間由你自由設(shè)定。前端請(qǐng)求時(shí)后端從Redis查一次查到了就是合法請(qǐng)求查不到就是未登錄或已過期。這個(gè)方案在微信API場景里其實(shí)是最穩(wěn)的。理由很直接可以隨時(shí)刪除Redis里的key實(shí)現(xiàn)強(qiáng)制下線、踢人、封禁過期時(shí)間可以精確到秒還能通過Redis的TTL動(dòng)態(tài)續(xù)期不需要引入JWT庫、密鑰管理、簽名算法代碼量小、出問題面窄唯一缺點(diǎn)是多一次Redis網(wǎng)絡(luò)開銷但對(duì)絕大多數(shù)業(yè)務(wù)來說這個(gè)成本可以忽略表JWT與不透明Token在微信API場景下的能力對(duì)比能力維度JWT不透明TokenRedis服務(wù)端狀態(tài)依賴無狀態(tài)不依賴存儲(chǔ)強(qiáng)依賴Redis主動(dòng)撤銷踢人/封禁困難需要黑名單直接刪key即可過期時(shí)間精確控制依賴exp聲明不可動(dòng)態(tài)改Redis TTL隨時(shí)可調(diào)跨端登錄/多設(shè)備管理難以區(qū)分同一賬號(hào)的多個(gè)Token可通過綁定標(biāo)識(shí)精確管理攜帶用戶信息內(nèi)嵌payload無需查詢需要查Redis獲取用戶信息實(shí)現(xiàn)復(fù)雜度需要引入庫、配置密鑰低純Redis操作2.3 雙Token機(jī)制access_token refresh_token的正確打開方式我現(xiàn)在的常規(guī)做法是雙Token配合使用access_token短時(shí)效通常2小時(shí)和微信平臺(tái)token對(duì)齊便于記憶每次請(qǐng)求攜帶校驗(yàn)時(shí)查Redis驗(yàn)證有效性refresh_token長時(shí)效7天到30天不等只在access_token過期時(shí)使用換取新的access_token交互流程是這樣的用戶登錄成功后后端同時(shí)簽發(fā)access_token和refresh_tokenaccess_token有效期2小時(shí)refresh_token有效期7天并持久化存儲(chǔ)。前端在收到401或約定的續(xù)簽狀態(tài)碼時(shí)攜帶refresh_token請(qǐng)求刷新接口后端校驗(yàn)refresh_token有效后簽發(fā)新的access_token并返回給前端。如果refresh_token也過期了用戶才需要重新走微信授權(quán)登錄。這套機(jī)制的價(jià)值在于用戶體驗(yàn)上一次登錄保持一周而安全上真正的核心憑證access_token始終是短時(shí)效的就算被截獲破壞窗口也控制在2小時(shí)內(nèi)。refresh_token本身的存儲(chǔ)要嚴(yán)格管理前端最好放在HttpOnly的Cookie里避免JavaScript讀取降低XSS竊取風(fēng)險(xiǎn)。Java后端實(shí)現(xiàn)時(shí)refresh_token的簽發(fā)和校驗(yàn)代碼和access_token類似但是存儲(chǔ)的Redis key要區(qū)分比如// access_token的key String accessKey user:token:access: userId : accessToken; // refresh_token的key String refreshKey user:token:refresh: userId : refreshToken;校驗(yàn)邏輯上refresh_token的校驗(yàn)要多一步確認(rèn)它確實(shí)是被簽發(fā)給當(dāng)前用戶的同時(shí)對(duì)比Redis里存的refresh_token是否一致。這里有一個(gè)很隱蔽的坑如果你每次刷新時(shí)都重新生成了refresh_token也就是輪換那前一個(gè)refresh_token必須立即作廢否則就會(huì)有多個(gè)refresh_token同時(shí)有效用戶換設(shè)備時(shí)會(huì)出現(xiàn)連環(huán)失效的怪問題。我早期沒做輪換只刷新access_token不刷新refresh_token后來發(fā)現(xiàn)有些用戶的refresh_token被第三方截獲后長期有效嚇得我趕緊改成每次刷新都同時(shí)輪換兩個(gè)Token。3. 接口權(quán)限控制的落地代碼從攔截器到注解再到角色模型Token機(jī)制解決的是你是誰的問題權(quán)限控制解決的是你能干什么的問題。微信API后端里接口權(quán)限控制的常規(guī)實(shí)現(xiàn)路徑是攔截器解析Token → 注解聲明權(quán)限 → 權(quán)限校驗(yàn)器判定角色 → 不通過則拒絕訪問。下面我逐步拆解。3.1 攔截器層的Token校驗(yàn)Spring MVC里的統(tǒng)一入口Spring Boot下最直接的是實(shí)現(xiàn)HandlerInterceptor在preHandle里完成Token解析和用戶身份綁定。Component public class AuthInterceptor implements HandlerInterceptor { Autowired private StringRedisTemplate redisTemplate; private static final String USER_TOKEN_KEY user:token:access:; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 如果請(qǐng)求的是非接口資源比如靜態(tài)資源直接放行 if (!(handler instanceof HandlerMethod)) { return true; } // 從Header獲取Token約定自定義Header名稱避免與標(biāo)準(zhǔn)授權(quán)頭沖突 String token request.getHeader(X-Access-Token); if (StringUtils.isBlank(token)) { throw new BusinessException(401, 缺少訪問令牌); } // 從Redis查詢Token對(duì)應(yīng)的登錄態(tài)這一步同時(shí)完成了存在性和過期校驗(yàn) String userInfoJson redisTemplate.opsForValue().get(USER_TOKEN_KEY token); if (userInfoJson null) { throw new BusinessException(401, 登錄已過期請(qǐng)重新授權(quán)); } // 解析出用戶信息放入ThreadLocal或RequestAttribute供后續(xù)業(yè)務(wù)代碼使用 UserContext user JSON.parseObject(userInfoJson, UserContext.class); request.setAttribute(currentUser, user); return true; } }這段代碼有幾個(gè)容易漏掉的細(xì)節(jié)。第一HandlerMethod的判斷非常關(guān)鍵不加的話攔截器會(huì)把Spring Boot的/error端點(diǎn)或者其他非控制器請(qǐng)求也攔截掉導(dǎo)致報(bào)錯(cuò)頁都無法正常顯示。第二錯(cuò)誤處理上攔截器里拋出的異常要有一個(gè)全局異常處理器接收轉(zhuǎn)換成統(tǒng)一的JSON錯(cuò)誤響應(yīng)否則前端收到的可能是Spring默認(rèn)的500頁面而不是你約定的錯(cuò)誤結(jié)構(gòu)。第三把用戶信息塞進(jìn)request只是最基礎(chǔ)的做法追求性能的項(xiàng)目一般還會(huì)在解析成功后直接放入ThreadLocal但要注意在afterCompletion里清理ThreadLocal防止線程池復(fù)用導(dǎo)致用戶信息串號(hào)。3.2 自定義注解的權(quán)限聲明給接口打上權(quán)限標(biāo)簽光校驗(yàn)Token還不夠接口還必須聲明自己需要什么權(quán)限。我用自研注解的方式在Controller方法上標(biāo)注需要的角色或權(quán)限碼。Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface RequirePermission { String[] value(); // 要求的權(quán)限碼如 order:create boolean requireAll() default false; // 多個(gè)權(quán)限是全部滿足還是任一滿足 }Controller里的用法PostMapping(/order) RequirePermission({order:create}) public ApiResultString createOrder(RequestBody OrderCreateReq req) { // 業(yè)務(wù)代碼 }這個(gè)注解的含義是只有持有order:create權(quán)限碼的用戶才能訪問/order創(chuàng)建訂單接口。權(quán)限碼的命名我推薦使用資源:操作的格式比單純數(shù)字編號(hào)可讀性強(qiáng)得多微信小程序的管理后臺(tái)里做菜單權(quán)限配置時(shí)也直白。3.3 角色-權(quán)限模型不做用戶維度冗長的權(quán)限列表用角色中轉(zhuǎn)最常用的權(quán)限模型是RBAC基于角色的訪問控制用戶掛角色、角色掛權(quán)限碼。用戶登錄后簽發(fā)Token時(shí)我把該用戶擁有的權(quán)限碼列表直接緩存進(jìn)Redis這樣校驗(yàn)時(shí)不需要每次去查庫。Component public class PermissionAspect { Autowired private StringRedisTemplate redisTemplate; Around(annotation(requirePermission)) public Object checkPermission(ProceedingJoinPoint joinPoint, RequirePermission requirePermission) throws Throwable { // 從攔截器階段綁定的用戶信息中取出用戶ID ServletRequestAttributes attrs (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request attrs.getRequest(); UserContext user (UserContext) request.getAttribute(currentUser); // 查出該用戶的權(quán)限碼集合優(yōu)先走Redis緩存兜底查數(shù)據(jù)庫 SetString userPermissions getCachedPermissions(user.getUserId()); String[] required requirePermission.value(); boolean pass requirePermission.requireAll() ? Arrays.stream(required).allMatch(userPermissions::contains) : Arrays.stream(required).anyMatch(userPermissions::contains); if (!pass) { throw new BusinessException(403, 無權(quán)限執(zhí)行該操作); } return joinPoint.proceed(); } }權(quán)限碼緩存需要確保一個(gè)核心邏輯用戶權(quán)限變更時(shí)必須能立即生效。我采用的方法是權(quán)限緩存key里帶一個(gè)版本號(hào)或直接在變更時(shí)刪除該用戶的權(quán)限緩存下次請(qǐng)求重新從數(shù)據(jù)庫加載。這里最大的教訓(xùn)是不要在權(quán)限緩存里加自動(dòng)過期時(shí)間來保證更新除非你能接受最長過期時(shí)間內(nèi)的權(quán)限延遲。實(shí)際運(yùn)營場景中給某用戶加個(gè)權(quán)限他10分鐘內(nèi)還是沒權(quán)限這種反饋已經(jīng)足夠讓你被投訴了。3.4 攔截器、切面、參數(shù)校驗(yàn)的協(xié)作順序我的建議是責(zé)任鏈?zhǔn)浇M合第一個(gè)環(huán)是AuthInterceptor負(fù)責(zé)解析Token并綁定用戶第二個(gè)環(huán)是PermissionAspect負(fù)責(zé)基于注解做權(quán)限判定第三個(gè)環(huán)是Spring自帶的參數(shù)校驗(yàn)。如果Token都沒有根本不需要做權(quán)限判定如果權(quán)限不夠也沒有必要做參數(shù)校驗(yàn)和業(yè)務(wù)邏輯。這個(gè)順序不只是性能考量更是錯(cuò)誤語義的分層——401表示你是誰的問題403表示你的權(quán)限夠不夠的問題400表示你的參數(shù)對(duì)不對(duì)的問題。前端可以根據(jù)狀態(tài)碼精確提示用戶進(jìn)行不同的下一步操作。4. 微信側(cè)access_token的緩存與刷新并發(fā)場景下最容易翻車的環(huán)節(jié)前面三類Token中微信平臺(tái)級(jí)的access_token雖然不參與你的接口權(quán)限控制但它絕對(duì)是導(dǎo)致線上事故的重災(zāi)區(qū)。這一章單獨(dú)展開。4.1 全局access_token的Redis緩存方案與key設(shè)計(jì)公眾號(hào)/小程序的access_token互不通用所以Redis的key至少要把應(yīng)用類型帶進(jìn)去。我的設(shè)計(jì)wechat:access_token:{appId}value直接存token字符串不存JSON因?yàn)闆]什么別的元信息。調(diào)用微信API前先檢查Redis里有沒有這個(gè)key有就直接用沒有再調(diào)用微信的getAccessToken接口拉取并寫入Redis。public String getWechatAccessToken(String appId) { String key wechat:access_token: appId; String token redisTemplate.opsForValue().get(key); if (StringUtils.isNotBlank(token)) { return token; } // 加分布式鎖避免多個(gè)線程同時(shí)去拉取導(dǎo)致token互相覆蓋 String lockKey wechat:access_token:lock: appId; boolean locked redisTemplate.opsForValue().setIfAbsent(lockKey, 1, Duration.ofSeconds(10)); if (!locked) { // 沒搶到鎖的線程自旋等待通常對(duì)方會(huì)在幾百毫秒內(nèi)完成寫入 // 這里建議最多重試3次每次等待200毫秒再取不到就報(bào)錯(cuò) } try { // 雙重檢查搶到鎖后再次確認(rèn)Redis里是否已有token token redisTemplate.opsForValue().get(key); if (StringUtils.isNotBlank(token)) { return token; } // 調(diào)用微信接口拉取新token token fetchFromWechat(appId); // 微信返回的expires_in通常是7200秒為了避免臨界點(diǎn)恰好過期 // 這里故意提前寫入比如實(shí)際TTL設(shè)置為7000秒 redisTemplate.opsForValue().set(key, token, Duration.ofSeconds(7000)); return token; } finally { redisTemplate.delete(lockKey); } }4.2 提前過期策略為什么把TTL設(shè)為7000秒而不是7200秒很多人把微信返回的expires_in原樣作為Redis的TTL這是隱患。原因有二一是網(wǎng)絡(luò)延遲和代碼執(zhí)行本身要消耗時(shí)間你從微信拿到token到寫入Redis之間可能已經(jīng)過去了零點(diǎn)幾秒二是當(dāng)token的實(shí)際剩余時(shí)間還有幾秒時(shí)你發(fā)起的請(qǐng)求如果恰好落在過期點(diǎn)上微信會(huì)返回40001錯(cuò)誤碼invalid credential這時(shí)候你的程序還沒到觸發(fā)重新拉取的節(jié)點(diǎn)就會(huì)連續(xù)報(bào)錯(cuò)。所以我會(huì)統(tǒng)一把TTL設(shè)置成比微信給定值少200秒相當(dāng)于一個(gè)安全余量。這不是精密的計(jì)算純粹是實(shí)戰(zhàn)中為了減少邊界條件問題而做的保守選擇。4.3 獲取token時(shí)的這個(gè)隱藏細(xì)節(jié)多個(gè)服務(wù)節(jié)點(diǎn)同時(shí)去拉取的連鎖反應(yīng)微信官方文檔里明確警告不可頻繁調(diào)用獲取token的接口否則會(huì)被封禁IP。線上應(yīng)用如果是多節(jié)點(diǎn)部署每個(gè)節(jié)點(diǎn)啟動(dòng)時(shí)都會(huì)拉一次token寫進(jìn)各自的內(nèi)存或同一個(gè)Redis里后寫的會(huì)把先寫的覆蓋掉。最危險(xiǎn)的是如果你在不同節(jié)點(diǎn)上做了本地內(nèi)存緩存那么節(jié)點(diǎn)A拿到的token和節(jié)點(diǎn)B拿到的不一致當(dāng)微信側(cè)檢測到token被覆蓋獲取新token后舊token立即失效節(jié)點(diǎn)A的所有請(qǐng)求都會(huì)瞬間變成40001。處理辦法就是我上面代碼里展示的分布式鎖雙重檢查模式讓同一時(shí)間只有一個(gè)請(qǐng)求去微信拉token其他人復(fù)用。這個(gè)坑我在早期的單體應(yīng)用里沒遇到過一旦上了K8s多副本立刻就暴露了。4.4 與自建Token的關(guān)系你們之間少一個(gè)邊界還有一個(gè)很多人忽略的點(diǎn)微信的access_token和你自建的用戶Token雖然獨(dú)立管理但在接口上的調(diào)用時(shí)機(jī)是關(guān)聯(lián)的。用戶發(fā)起一次需要調(diào)微信API的操作時(shí)前端先帶自建Token請(qǐng)求你的后端你的后端再去調(diào)微信接口。如果微信access_token過期了哪怕用戶的自建Token完全正常這次業(yè)務(wù)也失敗了。所以我在后端封裝的微信API調(diào)用層里做了一個(gè)統(tǒng)一處理凡是調(diào)用微信接口返回40001且錯(cuò)誤信息是access_token無效時(shí)自動(dòng)刪除Redis里的舊token拉取新token并用新token重試一次這次請(qǐng)求。這個(gè)重試機(jī)制看似簡單實(shí)戰(zhàn)中能救回大量偶發(fā)的過期窗口問題。public String callWechatApi(String url, String body) { String token getWechatAccessToken(appId); String fullUrl url ?access_token token; ApiResult result httpClient.post(fullUrl, body); if (result.getErrcode() 40001) { // token失效清除緩存并重試 redisTemplate.delete(wechat:access_token: appId); token getWechatAccessToken(appId); fullUrl url ?access_token token; result httpClient.post(fullUrl, body); } return result; }但注意重試必須要有次數(shù)上限和日志記錄。如果微信側(cè)真的封禁了你的IP或者AppID重試一百次只會(huì)加重封禁程度。我通常只重試一次第二次仍是40001就直接拋錯(cuò)并告警讓值班的人去查原因。5. 疑難雜癥排查實(shí)錄那些線上環(huán)境下才會(huì)遇到的Token問題最后一個(gè)章節(jié)集中復(fù)盤我在微信APIJava后端項(xiàng)目里真實(shí)遇到過的幾個(gè)疑難問題每一條都是排查半天甚至通宵換來的經(jīng)驗(yàn)。5.1 現(xiàn)象用戶登錄后接口偶發(fā)401刷新頁面又正常復(fù)現(xiàn)路徑用戶通過微信小程序授權(quán)登錄后訪問一個(gè)接口偶發(fā)返回401用戶投訴后你讓前端強(qiáng)刷一次又正常了。這種偶發(fā)問題排查起來最惡心因?yàn)闊o法穩(wěn)定復(fù)現(xiàn)。根因前端在同一個(gè)頁面里并發(fā)發(fā)起了2-3個(gè)請(qǐng)求后端簽發(fā)的access_token只有一個(gè)而你在Token校驗(yàn)過程中可能用了校驗(yàn)后立即刪除Redis key的模式有些人為了嚴(yán)格確保Token只能用一次。并發(fā)請(qǐng)求同時(shí)到達(dá)第一個(gè)請(qǐng)求刪除了key第二個(gè)請(qǐng)求再查就查不到了于是401。正確的做法Token校驗(yàn)不能有一次性語義除非你做的是一次性的掃碼接口。常規(guī)登錄態(tài)校驗(yàn)只讀取Redis的值做比對(duì)絕不刪除。如果要做單點(diǎn)登錄只允許一個(gè)設(shè)備在線應(yīng)該用userId維度綁定最新的token而不是在每次請(qǐng)求時(shí)刪掉舊的。5.2 現(xiàn)象管理后臺(tái)操作正常但微信小程序端登錄總是提示登錄狀態(tài)已過期復(fù)現(xiàn)路徑后臺(tái)管理端用Web登錄一切正常小程序端用戶在7天周期內(nèi)頻繁被提示重新授權(quán)而且看起來沒什么規(guī)律。根因我在小程序端的登錄邏輯里要求前端必須在access_token過期前主動(dòng)調(diào)用刷新接口而刷新接口依賴refresh_token但refresh_token的Redis過期時(shí)間設(shè)置成了和access_token一樣的2小時(shí)。前端拿著7天有效期的refresh_token去換新access_token時(shí)Redis里的refresh_token早就沒了所以刷新失敗只能重新走微信授權(quán)。這類問題的高發(fā)點(diǎn)在于代碼里出現(xiàn)了多個(gè)過期時(shí)間的字面常量寫的時(shí)候沒統(tǒng)一。我的規(guī)避辦法是在項(xiàng)目里建一個(gè)TokenPolicy配置類把所有過期時(shí)間集中管理并注釋標(biāo)明每一類Token的過期策略。一旦出現(xiàn)問題可以先查配置類而不是在代碼里到處找魔法數(shù)字。5.3 現(xiàn)象微信服務(wù)器回調(diào)通知處理失敗Java后端收不到事件推送復(fù)現(xiàn)路徑公眾號(hào)配置了服務(wù)器回調(diào)URL可是微信服務(wù)器推送的事件如用戶關(guān)注、支付成功通知后端一直沒收到或者收到了但是校驗(yàn)簽名不通過。根因Token在這里指的不是前面說的認(rèn)證Token而是你在微信公眾平臺(tái)配置的服務(wù)器配置里的Token它用于參與簽名校驗(yàn)。這個(gè)Token是你自己設(shè)定的任意字符串微信推送消息時(shí)會(huì)在URL上帶上timestamp、nonce、signature參數(shù)你的后端需要用Tokentimestampnonce拼接后做SHA1哈希對(duì)比signature是否一致。很多人在這里把自建的用戶Token跟這個(gè)回調(diào)Token搞混把回調(diào)校驗(yàn)邏輯里用的Token從配置文件里換掉了然后所有回調(diào)都被拒。排查思路如果你確認(rèn)URL和事件推送都正常但簽名一直校驗(yàn)失敗先看你是不是真的從請(qǐng)求參數(shù)里拿了timestamp和nonce而不是從配置文件里的某個(gè)定時(shí)任務(wù)里拿的值。另外微信簽名校驗(yàn)有個(gè)比較坑的地方timestamp和nonce參數(shù)名與你自己的參數(shù)有可能沖突如果你在框架層做了統(tǒng)一參數(shù)處理可能把它們改名了導(dǎo)致校驗(yàn)時(shí)拿到的不是微信原始值。5.4 現(xiàn)象JWT Token過期后前端拿refresh_token去續(xù)期偶爾成功偶爾失敗復(fù)現(xiàn)路徑使用雙Token機(jī)制前端在access_token過期后調(diào)用刷新接口發(fā)現(xiàn)大約10%的概率會(huì)失敗失敗時(shí)返回401用戶重新登錄后恢復(fù)。根因我用的是JWT作為access_tokenrefresh_token存儲(chǔ)在Redis。刷新接口的邏輯是先校驗(yàn)refresh_token在Redis中有效然后簽發(fā)一個(gè)新的JWT access_token同時(shí)對(duì)refresh_token也做了輪換重新生成并更新Redis。輪換后的舊refresh_token會(huì)被刪除。問題出在并發(fā)場景如果前端在兩個(gè)請(qǐng)求里幾乎同時(shí)調(diào)用了刷新接口比如頁面恢復(fù)了多個(gè)掛起的請(qǐng)求第一個(gè)請(qǐng)求輪換了refresh_token第二個(gè)請(qǐng)求帶著舊refresh_token再來舊的已經(jīng)被刪了于是校驗(yàn)失敗。解決方案有幾個(gè)層面前端必須對(duì)刷新接口做唯一化處理同一時(shí)刻只允許一個(gè)刷新請(qǐng)求在途其他請(qǐng)求等待其結(jié)果后復(fù)用新的access_token后端可以引入短期并發(fā)容忍比如刷新接口在檢測到舊refresh_token已失效時(shí)再查一下Redis里是否有新refresh_token與當(dāng)前用戶關(guān)聯(lián)如果新Token剛生成時(shí)間戳在幾秒內(nèi)允許拿著舊token也換取一次同樣的新token這個(gè)問題的根本矛盾是輪換語義和并發(fā)容忍之間的沖突。微信的refresh_token機(jī)制里也明確說了能多次使用就是為了容忍網(wǎng)絡(luò)重試。我當(dāng)時(shí)把刷新接口改成校驗(yàn)通過則必定返回當(dāng)前有效的access_token而不是必須接受攜帶的那個(gè)refresh_token才算數(shù)徹底解決了偶發(fā)失敗。5.5 調(diào)試接口時(shí)怎么快速驗(yàn)證你的Token體系是否健康最后分享一個(gè)調(diào)試技巧微信API開發(fā)里接口權(quán)限控制和Token管理的問題很多時(shí)候不是邏輯錯(cuò)了而是不知道當(dāng)前系統(tǒng)里的Token處于什么狀態(tài)。我的做法是在后端寫一個(gè)只有運(yùn)維權(quán)限能訪問的診斷接口一鍵輸出當(dāng)前登錄用戶數(shù)、Token過期分布、Redis命中率、微信access_token剩余有效期、最近1小時(shí)401/40001錯(cuò)誤統(tǒng)計(jì)。這個(gè)接口不需要太花哨用幾個(gè)Redis命令加一個(gè)簡單聚合就能完成但排查問題時(shí)效率翻倍。GetMapping(/internal/auth/health) public ApiResultMapString, Object authHealth() { MapString, Object report new HashMap(); // 自建Token總數(shù) report.put(onlineUserCount, redisTemplate.keys(user:token:access:*).size()); // 微信access_token剩余有效期 String token redisTemplate.opsForValue().get(wechat:access_token: appId); Long ttl redisTemplate.getExpire(wechat:access_token: appId); report.put(wechatTokenTtl, ttl); // 最近N小時(shí)的401錯(cuò)誤統(tǒng)計(jì)從日志聚合此處省略實(shí)現(xiàn) return ApiResult.success(report); }這個(gè)診斷接口一定要限制在內(nèi)網(wǎng)或加獨(dú)立的強(qiáng)Token保護(hù)否則等于把系統(tǒng)內(nèi)部狀態(tài)暴露給攻擊者。我一般直接禁止外網(wǎng)映射訪問。微信API和Java后端配合下的Token管理說到底是一個(gè)分層分工的問題微信自己的憑證管好時(shí)效和緩存自建Token管好安全與權(quán)限兩者通過刷新重試機(jī)制銜接。把每一層的邊界畫清楚很多看似玄學(xué)的問題其實(shí)都能從某一層的Token生命周期管理不嚴(yán)謹(jǐn)里找到答案。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美草草高清日韩视频| 日日黄色三级网站| 欧美91精品国产自产| 欧美色图亚州激情| 中国亚洲呦女专区| 秋霞一级鲁丝片A片| 新视频sss国产| 极品白嫩美女白浆成人福利在线看| 激情婷婷黑人91| 艳美熟妇先锋一二三区| 狠狠爱综合| 无码操逼视频一下| 青青青在线高清视频在线一二三四区| 歐美性天天| 黄片无码在线制服| 国产精品亚洲免费| 日本丝袜人妻内射| 国产不卡免费在线视频| 97九色| 成人久久久精品| 啊啊啊啊啊在线观看网址 | 黑人嘿嘿嘿超爽免费视频| 成人无码欧美一级A片狼牙直播| 亚洲 欧美 另类 综合 偷拍| 亚洲综合春色| 97最新在线播放视频| 一级婬片120分钟试看| 欧美草草| 色香91| 中文字日本乱码| 丰满少妇乱子伦精品无| 午夜福利一区二区影院| 操一操摸一摸| 蜜臀久久99精品久久久久| 欧美变态激情网| 亚洲色图20p| 99亚洲天堂| 国产麻豆一级精品视频| 97任你吞精| 美中日韩无码| 天天色综合天天操| 国产激情视频在线观看| 午夜色婷婷| 欧美亚洲另类在线蜜桃| 一区二区三区四区免费视频| 91快色色色色色| 99re国产精品视频| 亚洲第一黄色av网站| 新亚洲无码| 国产精品亚洲一级av第二区| 在线国产福利网址导航| 大香蕉伊人色偷偷在线| 91黑人狂躁丰满熟妇| 成人五月香网在线| 91久久免费视频互動交流| 日韩二级| 久久亚洲AV成人精品无码| 亚洲国产午夜真人一级片中文字幕精品黄网站| 婷婷九月色| 美女t无毒不卡不卡| 99色在线| 麻豆国产视频精品观看| 91青青在线视频| 亚洲 欧美日韩 另类| 亚洲交性| 狠色婷婷久久一区二区三区_| 精品一区二区成人| 超碰99在线| 青青草日逼视频| 草草影院最新网址| 超碰久超碰久| 男人天堂 天天射| 四季av一区二区凹凸精品小说| 亚洲精品成人| 人人看欧美性爱| 欧美激情内射| 77国产精品| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 午夜福利合集| 久久精品无码不卡| 五月花婷婷| 亚洲激情av| 91在线美女| 中文字幕二区日韩天堂| 日韩另类| 蜜桃色院一区久久| 天天夜夜rb| 无码动漫av中文字幕| 最新岛国大片| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 最新亚洲人成网站在线影院| 狠狠色综合网| 亚洲欧洲第二视频在线观看色图| 欧美色图第一页| 国产精品高潮久久久无码| 天天色黄色影院天天操| 啊嗯好大视频在线观看| 久久久人妻| 国产又大又粗又长视频| 凹凸 69堂 在线播放| 色综和网| 免费视频无码| 91在线国产后入风骚翘臀美女素人| 欧美色图小说综合| 92性色国产午夜福利在线661| 成人自拍三级在线观看| 色欧美天天| 超碰在97| 琪琪精品免费一区二区三区| 天天夜夜久久| 久久精品一区二区一8| 国产日韩在线播放| 使劲用力艹少妇视频一区二区| 一本一道久久综合久久| 免费精品中文字幕| 碰人碰碰人人开房人肉| 91精品久久久| 一区二区不卡| 国产精品国产自产高清AV| 日韩久久三区| 97超碰欧美精品| 国产精品探花在线| 九热超碰| 热九九精品| 亚洲的天堂网| 亚洲一欧洲中文字幕在线| 欧美综合第一| 国产网站在线播放| 超碰 国产熟女精品一区| 一区操逼| 十八禁黄色成人网站观看| 91天天综合日韩欧美| 欧美成人黄网色网站| 国产亚洲日本| 大香蕉久| 亚洲激情深爱文学小说网站| 亚洲精品第一| 玖色av| 精品无码一区二区三区| 99蜜桃臀亚洲成人在线观看| 干干干天天| 天天舔天天日天天射| 亚洲精品白浆高清久久久久久| 蜜臀精品1区2区| 超碰78| 日韩人妻操B| 国产综合色精品在线观看| 精品超碰中文在线| 九月激情婷婷| 国产欧美日产一区二区三区 - 国产欧美日 | 老鸭窝成人免费毛片视频| 性爱av在线免费观看| 插B在线观看| 尤物一级在线免费观看| 国产性爱强奸乱伦大全| 亚洲情色一区三区| 秋霞一级视频在线观看免费| 中国少妇啪啪视频| 欧美在线色图| 久久久精品视频免费观看| 九九九久久久W精品| 九色 人妻 大香蕉| 伊人丁香五月婷婷| 91美女视频直播| 国产精品午夜高潮呻吟久久av| 9 1超碰九色| 校园春色之综合网| 一区二区三区黄色片a| 人妻素股| 青青青操| 囯产乱伦一区二区三女 | 黑人美精品 A片| 一区二区三区黄片免费观看| 精品超碰国产| 色色色日本| 九九热在线精品视频| 国产60区。| 亚洲啪啪性视频| 97亚洲综合在线| 亚洲丁香花色| 成人麻豆av电影网站| 中文字幕一二三av| 色娱乐色呦呦夜夜夜夜av| 四虎影院成年人片| 国产女人和拘做爰视频| 不卡二三区人妻少妇| 欧美老妇女内射网址| 性做久久久久久久| 久操网视频| 天美传媒AV在线| 久久久中文版| 人妻在线臀日韩| 国内精品久久人妻性色av| av影院十区| 欧美性高潮| 色婷网| 亚洲学生妹高清av| 欧美精品系列| 骚女高跟AV在线| 亚洲,欧美,春色,另类| 全球成人中文在线| 99热99在线播放激情| 青娱乐啪啪视频| 综合色久欲| 97 九色| 九九热免费国产视频婷婷伊人五月| 强奸乱伦中文字幕AV| 麻豆 欧美 日韩| 九九精品热| 囯产操逼片| 国产强奸乱伦第1页| 大香蕉之青青草原| 伊人青青草久久| 日韩乱码Av| 亚洲人妻av| 动漫av中文| 特级大荫道BBwBBwBBW| 久久精品人妻一区二区| 欧洲大香蕉| 大香蕉欧美伊| 五十路熟女工口| 日本欧美韩国国产在线| 无码视频一区二区| 久久男人网| 青青草原人妻| 不卡码视频| 久久色激情一区二区三区| av中文在线| 99精品久久| 亚洲激情综合| 玖玖综合色| 欧美少妇一区二区三区| 国产传媒日本欧美专区| SS久久| 青青青青草av在线观看| 330dv亚洲成年视频网| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 骚逼高潮久久精品| 天天舔天天 | 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 神马久久久久久久| 色呦呦国产精品免费看| 欧美一级美片在线观看免费| 国产 日韩 欧美一区| 亚洲欧美日韩中文播放| 国产日韩手机视频在线| 亚洲自拍天堂| 亚洲人人操| 人妻天天操天天爽视频免费| 欧美色997| 中文字幕天天操| 欧美日韩97在线| 亚洲九九视频| 亚洲无码免费看| 国模精品娜娜一二三区| 国产精品视频电影| 天操天操夜操夜月操月年年操操| 精品无人区麻豆乱码1区2区图片| 校园春色 欧美| 国产综合在线视频网站| 中文字幕一区二区三区视频播放| 欧亚综合一卡二卡中文字幕| 北京美女一区二区| 97国产精品一区| 日本人妻丰满熟妇久久久久久| 久久久精品91八戒| 五月婷婷六月激情| 中文字幕人乱码中文字的预防方法 | 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲 欧美 精品专区 极品| 欧美色性爱| 九九色色| 欧美色图97| 天天上日日上日韩精品| 日本在线一二| av2014 日韩在线中文字幕| 999久久久免费精品国产牛牛| 久久久无码av精| 手机不卡视频不卡在线一二三区| 夜夜做夜夜爽精品视频| 日本成人A片网站| 精品久久青青草| 天天影视综合色| 精品国产人成在线| 激情四射婷婷四五月天| 亚洲视频二区 | 三男一女不戴套的A片| 日韩啪啪视频| 天天超级碰碰碰| 美女天天干| 激情久久久| 四季av一区二区凹凸精品小说 | 五月丁香激情综合网| 国产中文日韩欧美一区二区三区人妻丝袜美腿| 国产无码成人无码| 五月婷在线| 久操av在线| 韩日色费| 欧亚久久偷拍视频| 免费一级性爱久久| 老熟女熟妇| 蜜臀在线视频| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 强奸乱伦AV网站| 亚洲伊人久久精品狠狠在线| 久操精品| 国产精品制服丝袜中文字幕日韩一区二区三区| 青青草国产欧美非洲黑人| 五月天激情视频| 78m啪啪啪| 人人扣人人操| 色图四区| 亚州情色j区| 日本一区不卡| 青青草自拍视频在线播放| 99热在线播放| 日韩天堂av电影在线观看| 欧美综合网| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 校园春色五月天| 99自拍视频在线| 欧美性高潮| 亚洲色吧网| 大香蕉欧美| 夜夜爽妓女| 熟女激情综合网| 91草草草| 大香蕉黄色一区| 超碰97COm中文| 精品无码一区二区| 亚洲成人一区二区精品| 97超碰色中文字幕| 五月婷婷综合网| 久久夜夜| 青青草无码视频| 99精品成人免费看| 欧美日本成人一区二区| 欧美天堂超碰97| 国产女人操逼视频| 欧美综合天天| 亚洲精品国产熟女久久久| 欧美黄片视频在线观看免费| 岛国片在线播放| 国产绿奴视频在线观看| 国产嫩草精品A88AV| 亚州色交| 九九久久一区二区伦理| 久久久精品网| 青木玲在线不卡| 五月丁香激情综合网| 人人搞人人插人人操| 欧美一区二区三区黄色影视| 夜夜爽爽爽| 蜜乳AV.COM| 亚州欧美在线| 亚洲污污网站| 蜜臀久久久久久999| 成人性爱av| 日1区2区3区2020| 7月婷婷综合| 精品国产www久久| av黄图片在线观看| 伊人操| 台湾佬中文娱乐网久久久久久久久久com | 六月丁香久久| 成人激情无码在线视频| 在线a亚洲视频播放在线| 91精品久久久久久77777| 青青爽| 婷婷在线精品| 久久首页| 中文字幕一区二区免费在线| 国产性爱强奸乱伦大全| 97国产精品一区| 亚洲欧洲第二视频在线观看色图| 搡老熟女免费视频 | 久久伊人最新网址视频| 91久久午夜无码鲁丝片久久人妻| 91天堂丝袜美腿| 玖玖爱免费观看视频| 亚洲 无码 偷拍| 男同专区一区二区三区在线| 一级性爱aaaa| 五月天伊人| 天堂涩涩| 超碰在线人妻不卡| 91天美传媒在线观看| 亚州熟女乱伦| 九九九九九九精品| 日韩电影天堂视频一区二区| 日本曲间由美性生活片| 99无码视频| 秋霞一级视频在线观看免费| 自拍视频一区在线观看| 久久久久免费看少妇A片特黄| 欧差乱伦二三| 网站A V在线| 88xx成人精品视频| 综合久草| 欧美性爱无码一区二区三区| 国产福利电影| 大肉棒导航| 激情自拍 校园春色| 欧美性爱另类综合| 午夜男女爽爽爽在线视频| AV网站高清无码在线观看| 久久草草亚洲蜜桃臀| 囯产精品久久久久久久久久梁医生 | 日本啊啊啊啊啊视频| 操99| 欧美激情总合网| 久久久久久性爱片| 啊好大好舒服| 性交一区二区在线播放| 爱我干综合| 国产综合永久精品日韩鬼片| www.男人天堂| 日韩精品99999| 欧美色三级片91| 九九九久千久久激情蜜桃在线看 | 夫妻AV网站| 狠狠躁伊人中文字幕| 狠狠爱夜夜| 思思久热在线精品66| 欧美特大AA级黄片| 强奸乱伦av电影| 97色婷| 日本免费一区二| 91老熟女老女人国产老太| 毛片麻豆91糖心精品毛情片| 国产精品播放| 国产浮力影院第1页| 久久HD| 亚洲精品天天影视综合网| 99国产在线绯色一区| 啊啊啊好大好湿| 日比av无码| 91女在线观看| 国产精品午夜精品| 最新日本中文字幕| 色丁香五月婷婷| 男女91| 亚洲丝袜二区在线| 亚洲制服欧美另类内射| 美女让帅哥通她小鸡鸡| 中文字幕视频免费| 久射吧| 色 婷97| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 人妻少妇av在线观看| 久久久一热在线播放| 欧美 亚洲 另类 综合| 久操国产在线| 日欧亚洲二三区大片不卡| 男人的天堂在线有码| 亚洲一区制服诱惑| 久久毛卡| 欧美色狠| 欧美日韩操逼动图| 国产欧美第五页| 亚洲精品乱码线路中文字幕| 人妻 欧美 中文| 亚洲春色一区二区三区| 台湾佬中文娱乐网久久久久久久久久com| 婷婷人妻激情| 一级人妻性爱视频| 国语人妻精彩刺激| 大香蕉乱伦视频网| 五月天综合网| 国产自制av蜜乳| 99色热| 97久久天天综合色天天综合色电影| 天天草天天日| 欧美黑人猛交春色影视大全| 少妇三p| 黄网色一区二区三区四区精品| 大香蕉色网| 中文一区二区三区影院| 99热这里只有精品8| 97久久天天综合色天天综合色电影| 一级成人性爱| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 91精品久久久久五月天精品| 国产13区| 人妻一区二区三区四区视频| 欧美淫穴| 天天日天天干天天操| 欧美另类综合久久| 国产深夜福利| 伊人网综合在线视频| 国产精品网站www| 国产精品盗摄 偷窥盗摄| 国产精品熟女AV中文字幕在线播放| 欧美色网络| 色婷婷网| 国产久久久| 日韩pv中文| 国产精品白领在线观看| 东京热av男人的天堂| 国产精品视屏| 和协无码影院| 日韩亚洲国产视频| 亚洲揄拍网| 国产11页| 亚洲无码超碰免费| 99黄页网站| 久久无码电影| 97chaopengongkai| 亚洲情色一区综合| 尤物黄色在线观看网站| 亚欧洲一区二区视频| 亚州操逼网| 亚洲国产一区二区三区四区国产| 国产AV中文| 色综合中文字幕不卡| 色综合久久av| 色香伊人| 亚洲和欧美裸体美女双飞视频| 日本成人A片网站| 和协影院中文字幕三区| 伦激情人妻另类人妻| 老熟女综合网| 蜜臀少妇一区二区| 免费视频在线一区二区不卡| 啊嗯嗯啊好大好爽| 超碰久久性爱| 成人乱码一区二区三少妇| 很很很很操| 九九色图| 亚洲好看强奸乱伦| 一本色道久久综合精品婷婷| 99操| 柠檬AV导航| 日日夜夜干| 91激情国产| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 观看免费区二区三区二| 亚洲砖码砖专无区2023| 综合97| 天天内射| 欧美亚洲影视| 久久久久免费少妇| 国产亚洲日本精品在线| 1000部熟女视频在线观看| 91男女| 亚洲天堂人人妻| 午夜人妻精品综合在线| 欧美成人色| 伊人91| 国产精品久久伊人| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 欧美成人一级免费电影| 九九九九九九九九九国产精品 | 少妇被c 黄 免费观看| 欧美日韩人妻少妇 一区二区三区| 97精品国产97久久久久久| 国产三级中文有码在线视频| 欧美性爽xyxOOOO| 中文字幕av一区二区三区人妻少妇 | 精品十三区| 国产剧情一区在线观看| 色婷婷五月综合激情中文字幕| 国产又黄又粗的视频| 色99999| 精品人妻久久久| 国产亚洲国产超碰| 亚洲成人一区二区精品| 国产一区免费午夜视频| 男人女人18禁片免费看网站| 午夜操一操| 亚洲偷91色| 精品久久久不卡一区二区| 中文字幕免费观看| 超碰碰97| 97在线观视频免费观看| 精品人妻一区二区乱码一区二区| 午夜呻吟欧美| 一区二区三区四区姦女| AV天堂男人的天堂| 蜜臀99999| 中文字幕久久精视频久久大全| 九九精品美女高溯喷水 | 欧美白嫩在线放| 五月婷婷深深爱| 丁香六月综合激情| 99热这里只有精品9| 五月天综合网| 天美麻豆精品视频99| 欧美1727免费观看视频| 国产精品乱人伊人网| 婷婷情色综合网| 黄总AV色图| 九九九九九九九九九九九九九九九女| 久久综合av| 中文熟女五十乱码在线| 抽插亚洲无码| 97色碰| 色婷婷六月丁香七月婷婷| 你懂的在线观看区国产| 亚乱色| 丁香色色网| 国产av高清版| 999综合色| 久久华人网| 国产日本顶级一区二区三区| 性欧美91| 狠狠操综合| 伦在线97| 4tube欧美女厕所| av天堂电影网| 99老司机精品视频在线观看| 国产精品久久久三级无码| 盗摄 精品 另类 一区| 国产无遮挡| 综合激情一一91| 熟妇一区二区| 欧美一级久久久丰满| 五月婷婷性爱| 夜夜福利| 91人妻人人澡人人爽人人精品| 激情天天视频| 偷拍自拍在线视频观看| 人妻少妇色综合| 超碰天天操| 91bbbbbb| 国产强奸超碰AV| 97一区二区蜜臀| 欧美图片校园春色| 婷婷久月| 日韩欧美经典在线观看| 99热啪啪| 伦理日韩国产久久| 国产精品黑人一区二区三区| 夜夜草网站| 国精综合一二三区影视| 亚洲超碰AV| 九色婷婷| 综合av影片| 在线看污网站| 亚洲成a人片在线观看中文!!!| 人人人人人人少妇| 亚洲风情综合网| 国产精品毛片?v一区二区三区| 色婷婷影院| 热G综合热G中文| 26uuu性物| 久久久久久久久久久久久久久乱码 | 色官网在线| 超碰98综合网| 欧美日韩黄片精品在线| 夜夜狼人妻| 日本二三四区| 午夜一区| 欧美综合亚洲| 黄片直播三级黄片两女一男| 亚洲永久AV无码精品秋霞| 久久久9999| 亚洲精品视频在线播放| 噜噜噜在线视频| 日本一二区免费| 亚洲综合影院| 久久手机视直播| 国产精品福利视频| 69精品少妇一区二区三区蜜桃| 91精品人妻五十路| 亚洲午夜福利视频| 欧美日本视频一区| 亚洲激情在线一区二区| 玖玖爱综合网| 午夜免费福利视频一区| 天天天干977| 青青草日韩无码| 久久精品国产亚洲av水密被窝| 伊人激情五月天一区二区| 91N综合网在线| 国产中文字幕曰本毛片| 亚春色色| 精品国产一级久久| 亚洲人妻日日日| 啊啊啊好爽快点啊啊啊嗯嗯| 超碰97中文| 激情一区二区三区在线观看| 亚洲 小说 欧美 激情 另类| 殴美性色a级欧美| 操东北女人| av情色影音| 偷拍色图| 人妻少妇av在线观看| 久久久久久999| 国产白领连续中出在线观看| av爱爱爱| 怡红院亚洲怡春院av| 亚洲成人免费在线| 亚洲欧美综合| 另类av综合久久| 国产版a级片直播在线| 天天干夜夜鈤| 麻豆精品A片免费观看| 无码在线亚洲| 欧美日韩亚洲少妇寂寞影院正在播放| 在线只有精品| 熟妇的味道HD中文字幕| 999色欧美中文字幕| 91在线欧色| 国产成人手机视频激情| 亚洲 日本 不卡| 中文久久一区| 国产一区二区三区影片| 人人摸人人入| 啊啊啊啊啊舒服| 日韩美女久久一区二区三区| 色色色色日本| 中文字幕乱亚洲美女精品一区| 青青青青草av在线观看| 91超级碰| 无码精品人妻一区二区三区妖精 | 欧美天堂超碰97| 国产精品老师| 亚洲av无线观看| www久久国产精品| 强乱老妇中文字幕| 天美传媒在线一区| 97在线免费看| 9999免费精彩视频| 国产精品亚洲天堂网址| 日韩猛交| 中文精品少妇天堂| 五月天综合网| 亚洲少妇喷视频看| 精品性爱无码在线播放| 99这里只有精品国产| 伊人麻豆传媒| 国产丁香精品露脸视频| 久久大陆| 闷骚老熟女15P| 天美av在线观看| 日欧操屄视频| 人妻aa| 黄色片,com| 台湾成人无码AV| www亚洲免费| 福利操逼| 亚洲色图欧美视频| www…国产操逼| 超碰人人干| 色婷婷丁香五月天| 五月丁香六月婷| 视频二区美腿丝袜制服人妻欧美 | 91粉嫩萝控精品福利网站_精品影音先锋国| 久久超碰国产一区二区三区| 亚洲国产精品成人久久蜜臀| 欧美第一页| 天堂v无码免费视频| 日本羞羞的视频在线播放| 无码操逼视频一下| 久操com| 精品国产乱码久久久久久口爆网站| 人人爱人人操人人性| 欧美麻豆成人同性GⅤ在线| 国模精品一区二区三区苹果色戒| 亚洲综合五月天婷婷丁香| 亚洲 欧美都市激情| 午夜天堂网| 亚洲欧洲无码一区夜| 欧美色图片欧美色图| 哈哈操电影| 一级性爱视频免费在线| 在线欧美69V免费观看视频| 国产无码一二三区| 又大又黄国产| 九一综合网| 欧美亚洲首页| 亚洲精品乱码线路中文字幕| 男人的天堂va| 欧美黄色大香蕉一区二区| 五月婷婷久久综合| 久久久9品一区二区三区| 九九无码久久精品视频| 免费毛片在线播放| 手机看av网站在线看| 一区二区激情国产熟女 | 97欧美精品综合| 亚洲国产亚洲天堂| 中文字幕一区二区视频在线观看| 污污汅18禁网站在线永久免费观看 | 99热思思| 都市激情人妻一区二区青青操视频| 偷拍欧美亚洲| 免费av在线播放二区| 色婷网| 亚洲一本色码中文字幕| 久久无码精品| 无码聚合| 亚洲天堂第一页| 天天日天天看| yellow网站免费观看日韩高清无码| 天天爽天天操| 美国三级日本三级久久99| 高清有码一区二区| AV中文在线| 亚洲熟妇综合久久久久久| 欧洲特黄毛片免费看欧洲毛片| 看日韩操逼| 婷婷香网站| 国产91精品在线免费| 亚洲啪啪性视频| 91美女色视频亚洲| 国产无吗在线播放| 麻豆2区1区天美| 久久有码视频| 中国国国产一级特黄毛片| 午夜性| 天天综合网91| 夜夜爽爽爽| 国语精品av| 婷婷操视频| Blackedraw视频一区二区| 久久综合日韩亚洲欧美| 九九九999久久久网站| 青娱乐久久艹| 97超色| 国产91精品福利在线| 99九九久久| 欧美黑人168页欧美黑人167| 热无码中文亚洲H一道本一区二区| 青草青青久久久久久国产| 欧中美三级一区二区三区| 国产超碰人人爽人人做| 夜夜青青无码影院| 性在久久久久久| 欧美性爱网97| 国产精品呦一区二区三区| 大香蕉伊在线久草麻豆天堂故事| 欧美高清18A片| 日本裸体久久色噜噜| 2023天天操夜夜操| 淫色网综合| 中文字幕高清精品一区| 91精品丝袜久久久久久无码人妻| 天天视频黄| 吉田爱美AV在线| 国产精品亚洲无码| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 婷婷成人久久久精品| 老熟女网站| 中文字幕精品丝袜| 国产精品探花色| 欧美天堂超碰97| 国产精品制服丝袜清纯唯美| 亚洲文学偷乱拍啪啪啪啪 | 91九色丰满高潮| 国产精品老师| 亚洲图片91| 人人澡人人爽人人精品| 亚洲无码国产精品久久| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 蜜桃久久久久久| 78精品| 欧美亚洲激情小说| 日韩中文字幕国产| 大香蕉琪琪日本女优不卡| 国产一区二区在线电影| 亚洲欧美洲综合| 日韩一999精品| 99国产精品视频尤物| 啊啊啊在线看| 中文字幕黑人大片| 少妇一级婬片免费放一级a性色.| 99热日| 欧美男人一区| 亚洲伊人a线观看视频| 妇女乱色二区| 91美腿丝袜在线观看| 强奸乱伦亚洲第一页| 国产精品色约约| 黄色网址久久精品欧美喷水| 八戒无码国产午夜福利| 97在线观看视频| 日韩 人妻 精品| 欧美系列在线一区二区| 91天堂| 欧美精品久久| 91麻豆天美国产欧美日| 在线免费观看日韩一区| 久操频道免费在线呗看| 日本不卡二三区| 久久婷婷五月天| 中国国产精品一区视频| 欧美日韩另类激情图片| 欧美亚洲涩涩| 天堂av2019| 睡产熟女乱伦| 精品国产91内射久久| 啪啪啪综合| 九九九九九九九九九九九九九九九女| 人妻嗯啊啊在线播放| 日韩成人性爱AV| 熟女乱3伦999| AV乱伦专区| 日韩精品第3页| 成人精品在线| 成在线人在线观看视频| 超碰97综合网| 伊人一区二区三区| 欧美黄页在线| 簧片免费看视频| 一区不卡在线观看av| 久久久四区| 日产精品久久久一区二区| 日本99一区二区| 高清不卡国产| 中文字幕第页| 久久婷色| 色欲日韩欧美在线一区| 北约熟女超碰| AV麻豆免费一区| 免费国产视频| 99av| 欧亚 另类 久| 日本天堂在线播放| 久草在| 中国黑人三级片网站上区| 日韩欧美女优电影| 大香蕉婷婷| 国产精品视频精品一二| 日韩乱中文| 色香伊人| 久插综合| 午夜欧美J进J出白浆流出久久久 | 一区二区你上我| 六月婷婷五月丁香| 九九热在线精品视频| 欧美啪啪女女| 亚洲码专区| 欧美日韩岛国大片在线观看| 久久亚洲AV无码专区国产精品| 人妻少妇被猛烈进入中| 久久综合国产精品国产| 国产久久成人| 高清无码 国产精品| 国产区91柔拿会所技师| 逼逼逼逼操操操操操操操操操午夜剧场 | 蜜乳AV.COM| 国产精品国产自产高清AV| 一起草欧美| 日韩熟女乱伦中出| 欧美经典一区二区三区| 国产无马视频| 国产 v乱码一区二| 亚洲色欲天天人妻无码系列专区| 东京热免费视频| 欧美精品四区| 97超碰天天爱天天爱| 久久爽爽精品| julia ann久久| 黑白配性爱AV成| 日本大香蕉综合网| 国产1024在线播放| 中国国产精品一区视频| 日韩激情啪啪| 久久麻豆一区二区| 精品国产72| 国产久9| 亚洲天天综合| 思思热国产在线视频| 中文字幕精品资源在线| 又黄又爽在线观看视频| 青青草精品| 日本高清一本二本免费不卡| 91人妻熟女| 免费的黄片有限公司| 久操视频资源站公开| 九九内射在线| 亚洲人妖网| 久久久日本电影| 欧美精品一区二区少妇免费A片| 五月天黄色激情视频| 黄色污污污污污污网站| 久日综合网| 啊啊啊好想要| 夜嗨影院| 日本精品88888888| 久久精品六区| 一级人妻性爱视频| 亚洲综合成人网| a人欧美综合天堂麻豆| 亚欧操逼片在线观看 | 亚洲精品官网在线观看| 韩国久久97| 日韩精品一区,二区 九九...老司机| 久九色| 精品国产久热在线观看| 天天综合网久久ww| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 色婷婷综合久久久久中文一区二区 | 蜜臀99久久国产| 91香蕉视频在线观看免费| 五月天婷婷色| 91性| 国产精品乱码久久| 玖玖玖玖精品国产剧情| 欧美日韩222| 日韩无码第3页| 亚洲熟女性高潮久久久| 少妇蜜汁| 美女9118禁| 丝袜熟女一区二区三区| 亚州乱码中文字幕综合久久久| 日韩欧美女求操每天更新| 国产亚洲精品av一区| 中文久久一区| 亚洲色狠| 麻豆人妻精品一区二区| 国产精品69久久久久孕妇欧美| 久久精品 六十路 熟女 欧美| 亚洲精品丝袜-不卡成人免费……| 亚洲天天精品| 思思热免费在线视频| 色爱综合网欧美| 久久久久亚洲| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 久草线上视频免费看| 高清无码一区二区三区| 欧美色图中文字幕| 国产综合日韩伦理| AV天天综合| 国产400孕妇孕交群| 丰满人妻一区二区三区| 97亚洲色图| 91丨九色丨国产打屁股| 亚洲综合有玛| 天天天做天天天爱天天天爽| 日韩 欧美 另类 人妻| 97精品综合久久网| 天堂а√在线最新版在线| 亚洲天堂自拍| 欧美日韩黄片精品在线| 国产男女无套97| 亚洲成人在线高清| 日本一二三高清| 蜜乳成人AV| 国产二区三区粉嫩在线| 一本大道不卡一二三区| 欧美人妻中出| 亚洲无吗在线视频| 午夜精品人妻二区三区| 亚洲最大的综合性av| 色哟哟AV| 久艹99| 97最新在线播放视频| 中文字幕福利视频一区二区三区在线观看| a级理论午夜日本| 亚洲精品黄码久久久久| 很很干很很操| 中文乱码字字幕在线第5页| 欧美高清性猛交| 日韩欧美成人综合在线| 少妇丝袜在线观看AV| 日韩AC| 91伊人| 欧美白嫩女HD| 欧美东京热精品A∨| 国产97在线播放| 五月综合激情| 人妻精品免费一二三区| 久久久111| 欧美日韩性爱精品| 色五月AV| 久久久专区| 成人丁香五月| 久久永久无码人妻视频| av天天在线| 国产视频一区二区免费| 91丝袜美女视频| 操b网站亚洲无码| 手机在线观看不卡无码av| 色色九区| 青青草啪啪网| 婷婷综合网| 免费a级毛片av无码久久精品中文字幕| 使劲用力艹少妇视频一区二区| 超碰在线观看av不卡| 91碰超| 蜜桃臀av一区二区| 尤物av网站| 国产亚洲日本精品在线| 精品黄色电影| 欧美熟女丝袜| 猛交交| 91强热人妻| 最新亚洲黄色免费电影| 欧美亚州色的图| 乱日视频| 免費黃色視頻觀看一| 亚洲一区二区三区在线激情| 男人的天堂久久狠| 真实高潮91| 色婷婷香蕉| 国产黄片精品在线| 大奶的诱惑| 日韩特一级久久| 欧美色66| 99热这里只有精品8| 人妻少妇被猛烈进入中| 九九九九9999| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 韩日男人的天堂| 亚洲人妻av| 国产AV无码AV| 国产精品永久免费10000| 国产一区在线看| 91热色| 天美传媒av一区二区| 天天综合影院91| 啊啊啊好爽快点啊啊啊嗯嗯| 97任你吞精| 亚洲AV无码AV吞精久久久久 | av亚洲天堂资源网站| 亚洲丝袜二区| www超碰| www色日本| 自拍偷拍 高清无码| 国产视频一区二区三区在线免费观看 | 欧美综合色| 丰满人妻-区二区三区免费| 亚洲高清在线se| 青春草A| 午夜福利久久久噜久噜久久综合 | 伊人操操| 2025亚洲男人天堂| 天天综合网一91网| 国产精品交换一区二区| 欧美在线播放aaaa| 亚洲 欧美日韩 另类| 中文字幕日韩人妻视频一区二区三区 | 91精品亚洲内射孕妇| 私人尤物在线精品不卡| 99av| 国产精品操| 精品高潮| 亚洲伊人成综合成人网| 久久人妻| 中文AV制服乱伦| 欧美v亚洲v综合v国产v妖精| 国产精品一区二区a| 婷婷色色五月天福利| 日本性爱视频一级| 激情天天视频| 日本免费中文字幕在线| 日逼视频日本| 搡老人老9丨女老熟人| 在线无码操| 日本福利二区视频| 国产精品一区二区黄片| 狠狠色婷婷7777久| 九九久久九九久久| 日韩一999精品| 上床不卡网站| 日韩av电影网站| 草B在线|