免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

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

從Token到接口權(quán)限:Java后端微信API對接的權(quán)限控制實戰(zhàn) 微信API對接這件事做Java后端的朋友應(yīng)該都有體會半數(shù)以上的聯(lián)調(diào)事故最后都出在Token上。不是微信返回的錯誤碼看不懂而是自己這套權(quán)限體系在并發(fā)、續(xù)期、多端登錄面前先垮了。我前后接過公眾號、小程序、企業(yè)微信第三方應(yīng)用從單機內(nèi)存緩存到分布式Redis從裸Token到JWT再到雙Token續(xù)簽踩過的坑攢了不少。這篇就把微信API開發(fā)里Java后端的接口權(quán)限控制和Token管理完整梳理一遍很多細節(jié)是官方文檔不寫、但線上環(huán)境一定會遇到的。1. 微信API對接中你面對的根本不是一種Token先把三種身份憑證分清楚很多人做微信開發(fā)時把Token當(dāng)成一個籠統(tǒng)概念這是后續(xù)所有混亂的根源。實際上在微信API場景下Java后端至少要管理三類完全不同的憑證它們的生命周期、存儲位置、失效策略各不相同。1.1 平臺級全局憑證公眾號/小程序的access_token這一類是微信開放平臺發(fā)放的全局調(diào)用憑證公眾號和小程序都有調(diào)用任何業(yè)務(wù)接口發(fā)消息、上傳素材、生成二維碼、獲取用戶列表等都必須攜帶它。特點是全局唯一、有效期7200秒兩小時、每天有調(diào)用次數(shù)上限公眾號是2000次通過IP白名單等方式可以提升到更高額度。關(guān)鍵點在于全局唯一。整個應(yīng)用只有一個access_token所有服務(wù)器節(jié)點、所有線程都要共享同一個值。如果你用本地內(nèi)存緩存每個節(jié)點各拿各的就會出現(xiàn)我這臺機器調(diào)接口成功、那臺機器調(diào)接口報40001的詭異現(xiàn)象。我在下面的章節(jié)會專門講緩存策略這里先記住一個結(jié)論微信的access_token必須是全局共享的Java后端一定要用Redis或類似中間件統(tǒng)一存放不能用JVM內(nèi)存。1.2 用戶級身份憑證網(wǎng)頁授權(quán)access_token/用戶憑證公眾號網(wǎng)頁授權(quán)、小程序登錄流程中用戶在授權(quán)后會拿到一個用戶維度的憑證。公眾號的網(wǎng)頁授權(quán)access_token有效期更短默認7200秒刷新用的refresh_token有效期長達30天而且每次刷新會作廢舊的refresh_token。小程序側(cè)的session_key則完全不公開給前端由code換回后只能保存在后端。這類憑證有個特點它和某個具體用戶綁定不是全局共享的。你可以把它存在Redis里key用userId維度設(shè)計設(shè)置與微信側(cè)一致的過期時間。很多人在這一步犯的錯是把用戶憑證和平臺憑證放在一起統(tǒng)一管理過期策略混用最后用戶明明還登錄著后端刷新時卻拿不到合法憑證去換新的導(dǎo)致所有用戶集體掉線。1.3 自建系統(tǒng)登錄態(tài)你的應(yīng)用自己的Token第三類是你在自己的Java后端里簽發(fā)的登錄態(tài)Token跟前兩類無關(guān)。用戶通過微信授權(quán)后你的后端確認了用戶身份然后自己發(fā)一個Token給前端后續(xù)所有請求都帶這個Token來訪問你的業(yè)務(wù)接口。這一類才是你在代碼里完全掌控的東西也是接口權(quán)限控制的主要抓手。我見過很多項目把這三類混為一談拿微信的access_token當(dāng)前端登錄態(tài)用的有拿session_key當(dāng)業(yè)務(wù)Token用的也有還有的自建Token直接照搬了微信7200秒的過期策略導(dǎo)致用戶每小時被迫重新登錄一次。正確的做法是三層隔離微信平臺憑證只用于后端調(diào)用微信API微信用戶憑證只用于換取用戶信息自建Token只用于你自家系統(tǒng)的會話管理。哪怕它們都叫Token存儲、續(xù)期、失效處理也要分開。2. 自建Token機制的設(shè)計取舍JWT、不透明Token和雙Token續(xù)簽自建Token是Java后端權(quán)限控制的基石但選型時很多人直接跟風(fēng)上了JWT或者干脆UUID一把梭上線后才發(fā)現(xiàn)問題。這套體系的核心指標其實就三個可撤銷性、過期控制粒度、存儲開銷。2.1 JWT的適用邊界無狀態(tài)是優(yōu)點也是撤銷難的根源JWTJSON Web Token這幾年在Java圈熱度很高尤其是配合Spring Security的OAuth2體系。它最大的優(yōu)點是服務(wù)端無狀態(tài)Token本身攜帶用戶信息、角色、過期時間校驗時只需要驗簽不需要查數(shù)據(jù)庫或Redis。但微信API場景下JWT有一個致命軟肋無法主動撤銷。用戶注銷、被踢下線、管理員封禁賬號時只要Token還沒過期且簽名合法服務(wù)端就無法拒絕它。典型的妥協(xié)方案是引入Token黑名單Redis里存一份已撤銷Token的標識但這就等于把狀態(tài)又引入了無狀態(tài)的優(yōu)勢大打折扣。我在一個電商小程序項目里用過純JWT方案運營后臺封禁一個惡意用戶后那家伙的Token還能再合法調(diào)用接口最多30分鐘直到我們把黑名單邏輯補上才解決。2.2 不透明Token一切盡在掌握中的常規(guī)選擇所謂不透明Token就是服務(wù)端生成一個隨機字符串UUID或SecureRandom生成存Rediskey是Token值value是用戶信息和權(quán)限快照過期時間由你自由設(shè)定。前端請求時后端從Redis查一次查到了就是合法請求查不到就是未登錄或已過期。這個方案在微信API場景里其實是最穩(wěn)的。理由很直接可以隨時刪除Redis里的key實現(xiàn)強制下線、踢人、封禁過期時間可以精確到秒還能通過Redis的TTL動態(tài)續(xù)期不需要引入JWT庫、密鑰管理、簽名算法代碼量小、出問題面窄唯一缺點是多一次Redis網(wǎng)絡(luò)開銷但對絕大多數(shù)業(yè)務(wù)來說這個成本可以忽略表JWT與不透明Token在微信API場景下的能力對比能力維度JWT不透明TokenRedis服務(wù)端狀態(tài)依賴無狀態(tài)不依賴存儲強依賴Redis主動撤銷踢人/封禁困難需要黑名單直接刪key即可過期時間精確控制依賴exp聲明不可動態(tài)改Redis TTL隨時可調(diào)跨端登錄/多設(shè)備管理難以區(qū)分同一賬號的多個Token可通過綁定標識精確管理攜帶用戶信息內(nèi)嵌payload無需查詢需要查Redis獲取用戶信息實現(xiàn)復(fù)雜度需要引入庫、配置密鑰低純Redis操作2.3 雙Token機制access_token refresh_token的正確打開方式我現(xiàn)在的常規(guī)做法是雙Token配合使用access_token短時效通常2小時和微信平臺token對齊便于記憶每次請求攜帶校驗時查Redis驗證有效性refresh_token長時效7天到30天不等只在access_token過期時使用換取新的access_token交互流程是這樣的用戶登錄成功后后端同時簽發(fā)access_token和refresh_tokenaccess_token有效期2小時refresh_token有效期7天并持久化存儲。前端在收到401或約定的續(xù)簽狀態(tài)碼時攜帶refresh_token請求刷新接口后端校驗refresh_token有效后簽發(fā)新的access_token并返回給前端。如果refresh_token也過期了用戶才需要重新走微信授權(quán)登錄。這套機制的價值在于用戶體驗上一次登錄保持一周而安全上真正的核心憑證access_token始終是短時效的就算被截獲破壞窗口也控制在2小時內(nèi)。refresh_token本身的存儲要嚴格管理前端最好放在HttpOnly的Cookie里避免JavaScript讀取降低XSS竊取風(fēng)險。Java后端實現(xiàn)時refresh_token的簽發(fā)和校驗代碼和access_token類似但是存儲的Redis key要區(qū)分比如// access_token的key String accessKey user:token:access: userId : accessToken; // refresh_token的key String refreshKey user:token:refresh: userId : refreshToken;校驗邏輯上refresh_token的校驗要多一步確認它確實是被簽發(fā)給當(dāng)前用戶的同時對比Redis里存的refresh_token是否一致。這里有一個很隱蔽的坑如果你每次刷新時都重新生成了refresh_token也就是輪換那前一個refresh_token必須立即作廢否則就會有多個refresh_token同時有效用戶換設(shè)備時會出現(xiàn)連環(huán)失效的怪問題。我早期沒做輪換只刷新access_token不刷新refresh_token后來發(fā)現(xiàn)有些用戶的refresh_token被第三方截獲后長期有效嚇得我趕緊改成每次刷新都同時輪換兩個Token。3. 接口權(quán)限控制的落地代碼從攔截器到注解再到角色模型Token機制解決的是你是誰的問題權(quán)限控制解決的是你能干什么的問題。微信API后端里接口權(quán)限控制的常規(guī)實現(xiàn)路徑是攔截器解析Token → 注解聲明權(quán)限 → 權(quán)限校驗器判定角色 → 不通過則拒絕訪問。下面我逐步拆解。3.1 攔截器層的Token校驗Spring MVC里的統(tǒng)一入口Spring Boot下最直接的是實現(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 { // 如果請求的是非接口資源比如靜態(tài)資源直接放行 if (!(handler instanceof HandlerMethod)) { return true; } // 從Header獲取Token約定自定義Header名稱避免與標準授權(quán)頭沖突 String token request.getHeader(X-Access-Token); if (StringUtils.isBlank(token)) { throw new BusinessException(401, 缺少訪問令牌); } // 從Redis查詢Token對應(yīng)的登錄態(tài)這一步同時完成了存在性和過期校驗 String userInfoJson redisTemplate.opsForValue().get(USER_TOKEN_KEY token); if (userInfoJson null) { throw new BusinessException(401, 登錄已過期請重新授權(quán)); } // 解析出用戶信息放入ThreadLocal或RequestAttribute供后續(xù)業(yè)務(wù)代碼使用 UserContext user JSON.parseObject(userInfoJson, UserContext.class); request.setAttribute(currentUser, user); return true; } }這段代碼有幾個容易漏掉的細節(jié)。第一HandlerMethod的判斷非常關(guān)鍵不加的話攔截器會把Spring Boot的/error端點或者其他非控制器請求也攔截掉導(dǎo)致報錯頁都無法正常顯示。第二錯誤處理上攔截器里拋出的異常要有一個全局異常處理器接收轉(zhuǎn)換成統(tǒng)一的JSON錯誤響應(yīng)否則前端收到的可能是Spring默認的500頁面而不是你約定的錯誤結(jié)構(gòu)。第三把用戶信息塞進request只是最基礎(chǔ)的做法追求性能的項目一般還會在解析成功后直接放入ThreadLocal但要注意在afterCompletion里清理ThreadLocal防止線程池復(fù)用導(dǎo)致用戶信息串號。3.2 自定義注解的權(quán)限聲明給接口打上權(quán)限標簽光校驗Token還不夠接口還必須聲明自己需要什么權(quán)限。我用自研注解的方式在Controller方法上標注需要的角色或權(quán)限碼。Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface RequirePermission { String[] value(); // 要求的權(quán)限碼如 order:create boolean requireAll() default false; // 多個權(quán)限是全部滿足還是任一滿足 }Controller里的用法PostMapping(/order) RequirePermission({order:create}) public ApiResultString createOrder(RequestBody OrderCreateReq req) { // 業(yè)務(wù)代碼 }這個注解的含義是只有持有order:create權(quán)限碼的用戶才能訪問/order創(chuàng)建訂單接口。權(quán)限碼的命名我推薦使用資源:操作的格式比單純數(shù)字編號可讀性強得多微信小程序的管理后臺里做菜單權(quán)限配置時也直白。3.3 角色-權(quán)限模型不做用戶維度冗長的權(quán)限列表用角色中轉(zhuǎn)最常用的權(quán)限模型是RBAC基于角色的訪問控制用戶掛角色、角色掛權(quán)限碼。用戶登錄后簽發(fā)Token時我把該用戶擁有的權(quán)限碼列表直接緩存進Redis這樣校驗時不需要每次去查庫。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)限碼緩存需要確保一個核心邏輯用戶權(quán)限變更時必須能立即生效。我采用的方法是權(quán)限緩存key里帶一個版本號或直接在變更時刪除該用戶的權(quán)限緩存下次請求重新從數(shù)據(jù)庫加載。這里最大的教訓(xùn)是不要在權(quán)限緩存里加自動過期時間來保證更新除非你能接受最長過期時間內(nèi)的權(quán)限延遲。實際運營場景中給某用戶加個權(quán)限他10分鐘內(nèi)還是沒權(quán)限這種反饋已經(jīng)足夠讓你被投訴了。3.4 攔截器、切面、參數(shù)校驗的協(xié)作順序我的建議是責(zé)任鏈式組合第一個環(huán)是AuthInterceptor負責(zé)解析Token并綁定用戶第二個環(huán)是PermissionAspect負責(zé)基于注解做權(quán)限判定第三個環(huán)是Spring自帶的參數(shù)校驗。如果Token都沒有根本不需要做權(quán)限判定如果權(quán)限不夠也沒有必要做參數(shù)校驗和業(yè)務(wù)邏輯。這個順序不只是性能考量更是錯誤語義的分層——401表示你是誰的問題403表示你的權(quán)限夠不夠的問題400表示你的參數(shù)對不對的問題。前端可以根據(jù)狀態(tài)碼精確提示用戶進行不同的下一步操作。4. 微信側(cè)access_token的緩存與刷新并發(fā)場景下最容易翻車的環(huán)節(jié)前面三類Token中微信平臺級的access_token雖然不參與你的接口權(quán)限控制但它絕對是導(dǎo)致線上事故的重災(zāi)區(qū)。這一章單獨展開。4.1 全局access_token的Redis緩存方案與key設(shè)計公眾號/小程序的access_token互不通用所以Redis的key至少要把應(yīng)用類型帶進去。我的設(shè)計wechat:access_token:{appId}value直接存token字符串不存JSON因為沒什么別的元信息。調(diào)用微信API前先檢查Redis里有沒有這個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; } // 加分布式鎖避免多個線程同時去拉取導(dǎo)致token互相覆蓋 String lockKey wechat:access_token:lock: appId; boolean locked redisTemplate.opsForValue().setIfAbsent(lockKey, 1, Duration.ofSeconds(10)); if (!locked) { // 沒搶到鎖的線程自旋等待通常對方會在幾百毫秒內(nèi)完成寫入 // 這里建議最多重試3次每次等待200毫秒再取不到就報錯 } try { // 雙重檢查搶到鎖后再次確認Redis里是否已有token token redisTemplate.opsForValue().get(key); if (StringUtils.isNotBlank(token)) { return token; } // 調(diào)用微信接口拉取新token token fetchFromWechat(appId); // 微信返回的expires_in通常是7200秒為了避免臨界點恰好過期 // 這里故意提前寫入比如實際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í)行本身要消耗時間你從微信拿到token到寫入Redis之間可能已經(jīng)過去了零點幾秒二是當(dāng)token的實際剩余時間還有幾秒時你發(fā)起的請求如果恰好落在過期點上微信會返回40001錯誤碼invalid credential這時候你的程序還沒到觸發(fā)重新拉取的節(jié)點就會連續(xù)報錯。所以我會統(tǒng)一把TTL設(shè)置成比微信給定值少200秒相當(dāng)于一個安全余量。這不是精密的計算純粹是實戰(zhàn)中為了減少邊界條件問題而做的保守選擇。4.3 獲取token時的這個隱藏細節(jié)多個服務(wù)節(jié)點同時去拉取的連鎖反應(yīng)微信官方文檔里明確警告不可頻繁調(diào)用獲取token的接口否則會被封禁IP。線上應(yīng)用如果是多節(jié)點部署每個節(jié)點啟動時都會拉一次token寫進各自的內(nèi)存或同一個Redis里后寫的會把先寫的覆蓋掉。最危險的是如果你在不同節(jié)點上做了本地內(nèi)存緩存那么節(jié)點A拿到的token和節(jié)點B拿到的不一致當(dāng)微信側(cè)檢測到token被覆蓋獲取新token后舊token立即失效節(jié)點A的所有請求都會瞬間變成40001。處理辦法就是我上面代碼里展示的分布式鎖雙重檢查模式讓同一時間只有一個請求去微信拉token其他人復(fù)用。這個坑我在早期的單體應(yīng)用里沒遇到過一旦上了K8s多副本立刻就暴露了。4.4 與自建Token的關(guān)系你們之間少一個邊界還有一個很多人忽略的點微信的access_token和你自建的用戶Token雖然獨立管理但在接口上的調(diào)用時機是關(guān)聯(lián)的。用戶發(fā)起一次需要調(diào)微信API的操作時前端先帶自建Token請求你的后端你的后端再去調(diào)微信接口。如果微信access_token過期了哪怕用戶的自建Token完全正常這次業(yè)務(wù)也失敗了。所以我在后端封裝的微信API調(diào)用層里做了一個統(tǒng)一處理凡是調(diào)用微信接口返回40001且錯誤信息是access_token無效時自動刪除Redis里的舊token拉取新token并用新token重試一次這次請求。這個重試機制看似簡單實戰(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重試一百次只會加重封禁程度。我通常只重試一次第二次仍是40001就直接拋錯并告警讓值班的人去查原因。5. 疑難雜癥排查實錄那些線上環(huán)境下才會遇到的Token問題最后一個章節(jié)集中復(fù)盤我在微信APIJava后端項目里真實遇到過的幾個疑難問題每一條都是排查半天甚至通宵換來的經(jīng)驗。5.1 現(xiàn)象用戶登錄后接口偶發(fā)401刷新頁面又正常復(fù)現(xiàn)路徑用戶通過微信小程序授權(quán)登錄后訪問一個接口偶發(fā)返回401用戶投訴后你讓前端強刷一次又正常了。這種偶發(fā)問題排查起來最惡心因為無法穩(wěn)定復(fù)現(xiàn)。根因前端在同一個頁面里并發(fā)發(fā)起了2-3個請求后端簽發(fā)的access_token只有一個而你在Token校驗過程中可能用了校驗后立即刪除Redis key的模式有些人為了嚴格確保Token只能用一次。并發(fā)請求同時到達第一個請求刪除了key第二個請求再查就查不到了于是401。正確的做法Token校驗不能有一次性語義除非你做的是一次性的掃碼接口。常規(guī)登錄態(tài)校驗只讀取Redis的值做比對絕不刪除。如果要做單點登錄只允許一個設(shè)備在線應(yīng)該用userId維度綁定最新的token而不是在每次請求時刪掉舊的。5.2 現(xiàn)象管理后臺操作正常但微信小程序端登錄總是提示登錄狀態(tài)已過期復(fù)現(xiàn)路徑后臺管理端用Web登錄一切正常小程序端用戶在7天周期內(nèi)頻繁被提示重新授權(quán)而且看起來沒什么規(guī)律。根因我在小程序端的登錄邏輯里要求前端必須在access_token過期前主動調(diào)用刷新接口而刷新接口依賴refresh_token但refresh_token的Redis過期時間設(shè)置成了和access_token一樣的2小時。前端拿著7天有效期的refresh_token去換新access_token時Redis里的refresh_token早就沒了所以刷新失敗只能重新走微信授權(quán)。這類問題的高發(fā)點在于代碼里出現(xiàn)了多個過期時間的字面常量寫的時候沒統(tǒng)一。我的規(guī)避辦法是在項目里建一個TokenPolicy配置類把所有過期時間集中管理并注釋標明每一類Token的過期策略。一旦出現(xiàn)問題可以先查配置類而不是在代碼里到處找魔法數(shù)字。5.3 現(xiàn)象微信服務(wù)器回調(diào)通知處理失敗Java后端收不到事件推送復(fù)現(xiàn)路徑公眾號配置了服務(wù)器回調(diào)URL可是微信服務(wù)器推送的事件如用戶關(guān)注、支付成功通知后端一直沒收到或者收到了但是校驗簽名不通過。根因Token在這里指的不是前面說的認證Token而是你在微信公眾平臺配置的服務(wù)器配置里的Token它用于參與簽名校驗。這個Token是你自己設(shè)定的任意字符串微信推送消息時會在URL上帶上timestamp、nonce、signature參數(shù)你的后端需要用Tokentimestampnonce拼接后做SHA1哈希對比signature是否一致。很多人在這里把自建的用戶Token跟這個回調(diào)Token搞混把回調(diào)校驗邏輯里用的Token從配置文件里換掉了然后所有回調(diào)都被拒。排查思路如果你確認URL和事件推送都正常但簽名一直校驗失敗先看你是不是真的從請求參數(shù)里拿了timestamp和nonce而不是從配置文件里的某個定時任務(wù)里拿的值。另外微信簽名校驗有個比較坑的地方timestamp和nonce參數(shù)名與你自己的參數(shù)有可能沖突如果你在框架層做了統(tǒng)一參數(shù)處理可能把它們改名了導(dǎo)致校驗時拿到的不是微信原始值。5.4 現(xiàn)象JWT Token過期后前端拿refresh_token去續(xù)期偶爾成功偶爾失敗復(fù)現(xiàn)路徑使用雙Token機制前端在access_token過期后調(diào)用刷新接口發(fā)現(xiàn)大約10%的概率會失敗失敗時返回401用戶重新登錄后恢復(fù)。根因我用的是JWT作為access_tokenrefresh_token存儲在Redis。刷新接口的邏輯是先校驗refresh_token在Redis中有效然后簽發(fā)一個新的JWT access_token同時對refresh_token也做了輪換重新生成并更新Redis。輪換后的舊refresh_token會被刪除。問題出在并發(fā)場景如果前端在兩個請求里幾乎同時調(diào)用了刷新接口比如頁面恢復(fù)了多個掛起的請求第一個請求輪換了refresh_token第二個請求帶著舊refresh_token再來舊的已經(jīng)被刪了于是校驗失敗。解決方案有幾個層面前端必須對刷新接口做唯一化處理同一時刻只允許一個刷新請求在途其他請求等待其結(jié)果后復(fù)用新的access_token后端可以引入短期并發(fā)容忍比如刷新接口在檢測到舊refresh_token已失效時再查一下Redis里是否有新refresh_token與當(dāng)前用戶關(guān)聯(lián)如果新Token剛生成時間戳在幾秒內(nèi)允許拿著舊token也換取一次同樣的新token這個問題的根本矛盾是輪換語義和并發(fā)容忍之間的沖突。微信的refresh_token機制里也明確說了能多次使用就是為了容忍網(wǎng)絡(luò)重試。我當(dāng)時把刷新接口改成校驗通過則必定返回當(dāng)前有效的access_token而不是必須接受攜帶的那個refresh_token才算數(shù)徹底解決了偶發(fā)失敗。5.5 調(diào)試接口時怎么快速驗證你的Token體系是否健康最后分享一個調(diào)試技巧微信API開發(fā)里接口權(quán)限控制和Token管理的問題很多時候不是邏輯錯了而是不知道當(dāng)前系統(tǒng)里的Token處于什么狀態(tài)。我的做法是在后端寫一個只有運維權(quán)限能訪問的診斷接口一鍵輸出當(dāng)前登錄用戶數(shù)、Token過期分布、Redis命中率、微信access_token剩余有效期、最近1小時401/40001錯誤統(tǒng)計。這個接口不需要太花哨用幾個Redis命令加一個簡單聚合就能完成但排查問題時效率翻倍。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小時的401錯誤統(tǒng)計從日志聚合此處省略實現(xiàn) return ApiResult.success(report); }這個診斷接口一定要限制在內(nèi)網(wǎng)或加獨立的強Token保護否則等于把系統(tǒng)內(nèi)部狀態(tài)暴露給攻擊者。我一般直接禁止外網(wǎng)映射訪問。微信API和Java后端配合下的Token管理說到底是一個分層分工的問題微信自己的憑證管好時效和緩存自建Token管好安全與權(quán)限兩者通過刷新重試機制銜接。把每一層的邊界畫清楚很多看似玄學(xué)的問題其實都能從某一層的Token生命周期管理不嚴謹里找到答案。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
狠狠综合| 91啪啪| 欧美群妇大交乱婬网| 婷婷五月色情| 国产欧美日韩综合精品一区二区| 五月婷婷六月丁香| 色五月激情综合网| 99热在线爱| 日韩人妻无码专区| 天天操人人干| 这里只有精品在线看| 色播播婷婷| 九九热免费视频| 五月丁香六月婷婷亚洲视频| 色噜噜狠狠色综合伊人| 婷婷综合色图| 操比激情五月综合| 九九色院| 久久激情婷婷| 久久九九热38| 亚洲亚洲人成综合网络| 97色干| 日韩操| 91人妻人人做人碰人人爽九色| 国产做A爰片毛片A片美国| 丁香五月日本| 亚洲精品乱码久久久久99| 亚洲区1| AV九九| 四色AVwww| 狠狠色丁香五月婷巨| 亚洲狠狠色丁香婷婷综合久久| 99riAV国产精品视频| 2025最新亚洲激情在线| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 开心五月六月婷婷| 亚洲视频二区| 91色在线/日韩| 丁香激情综合| JlZZJlZZ8JlZZ亚洲熟女| 老司机日日夜夜青草| 丁香五月婷婷日本| 婷婷五月天狠狠色| 色欲久久久久久综合网综合网| 国内精品玖玖| 无码网站视频| www.操.com| 五月丁香亚洲综合网| 久久婷婷色| 97爱综合| 超碰2021| 色五月自偷自拍婷婷婷婷| 五月丁香成人网| 激情五月天在线免费美女视频| 五月丁香激情在线| 欧美爆乳一区二区三区| 九九热视频精品| 久草xx性爱视频| 天干天天干天天天天天| 99黄色| 91啪级电影| 五月天激日本色情在线| 中文字幕 久久9999| 91viP在线看| 亚洲精品在线视频| 亚洲区,视频区,视频区免费| 婷婷丁香五月激情图片| 99视频只有精品| 五月婷婷啪啪综合网| 亚洲色五月婷婷| 熟女五月天久久综合| 99九九玖玖| 人人操 色| 亚洲天堂九九九| 精品九九网| 无码一区二区三区四区五区91c| 99视频啪啪| 丁香五月亚洲综合| 超碰免费99| 久久久99久久| 夜夜天天久久婷婷| 亚洲人成色A777777在线观看 | 人人摸人人搞| 九九热123| 色五月在线播放| 九九热在线视频观看| 日本99久久| 色欲色欲久久宗合网| 99久99久| 99热精品少| 懂色AⅤ| 91视频综合网| 99在线视频观看| 婷婷五月天AV在| 丁香五月亚洲激情婷婷射| 五月丁香婷婷成人伊人网| 五月激情婷婷在线| 亚洲日韩乱码一区二区三区四区| 六月丁香色色| 欧美成人A片AAA片在线播放| 免费看欧美成人A片无码| 影音先锋天天日| 91久热| 婷婷五月天综合中文| 思思热在线视频精品| 丁香五月婷老师| 色5月丁香婷婷| 超碰狠狠操| 亚洲第一成人无码A片| 五月天大香焦| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 桃色五月天| 粉嫩av蜜桃av蜜臀av| 五月激情小说| 久久性刺激| 情五月亚洲婷婷| 五月丁香成人小说| 欧在线一区| 丁香五月91| 婷婷之六月丁香| 亚洲色图五月丁香| 亚洲视频1区| www。88热在线视频免费观看| www.色五月.com| wwwss在线观看| 色婷婷色和| www.天天色综合| 色噜噜在线| 色噜噜五月天| 九九九九九九毛片| 色亚洲欧洲| 五月激情在线| 依人大香蕉| 五月丁香婷婷基地| 九月色婷婷综合亚洲| 婷婷操逼| 婷婷操逼| 99色天堂| 欧美婷婷五月丁香| 九九综合精品| 色婷操逼| 丁香婷婷人妻| 激情婷婷六月天| 欧美啪啪五月天| 丁香五月六月婷婷综合激情| 丁香五月天大香蕉啪啪| 亚州AV超碰人人操| 97婷婷五月丁香| 丁香五月狠狠综合欧美| 亚洲亚洲人成综合网络| 六月婷婷影院| WWW色色色COM| 狠狠干在线| 九九热这里只有精品9| 婷婷大美在线| 99燥99日| 99er热精品视频| 婷婷色五月91啪啪| 激情文学五月丁香六月婷婷| 色五月婷婷91| 久久五月天综合| 久月婷婷| 五月天激情网图片| 99re这里只有精品首页| 婷婷五月超碰| 激情婷婷五月天| 大鸡巴伊人网| 丁香婷五月天开心六月| 第四色激情网| 婷婷不干网| 五月丁香WWW| 五月天激情婷婷| 人人草成人视频| 激情综合网五月婷婷| 婷婷色五月激情| 99日本黄站| 99热这里只有精品1025| 天天爽天天操| 亚洲人妻五月丁香婷婷| 日韩99视频| 五月天激情综合| 色玖玖爱| 91超碰人人操| 亚洲综合五月天婷婷| 天天综合网亚洲网站| 婷婷五月天VI| 狠狠干综合网| 五月开心六月婷婷在线播放网站| 97男人天堂| 五月婷婷婷| 中文字幕成| 91视频一起草| www.五月天婷婷姐姐| 婷婷久久婷婷色五月| 美女天天爽| 婷婷娌伦网| 色婷婷综合久久久久| 桃色Av色哟哟| av在线不卡播放| 99九九在线观看免费| 69热在线| 九月丁香八月婷婷久久综合久97| 狠狠狠狠狠狠| 久久久久人妻| 激情五月婷婷在线区| 永久精品| 99九九视频精彩在线| 婷婷久久亚洲| 九九热99在线视频| 97精品人人A片免费看| 亚洲色a| 久久婷婷五月激情综合| 夜精品无码A片一区二区蜜桃| 中文字幕久久一区二区三区| 久er免费视频| 五月婷婷六月丁香首页| 怡红院AV亚洲一区二区三区H| 五月天狠狠| 婷婷五月天丁香花| 播五月,色五月,开心五月播放器| 久热这里只有精品99re,久热这里只有精品7 | 亚洲无码AV片| 成人无码精品1区2区3区免费看| 天天天天干| 激情的五月婷婷蜜桃| 91日综合欧美| www.玖玖九| 大香蕉久操| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪 | 婷婷综合九月| 99久久婷婷国产综合亚洲| 久久五月综合| 久99在线视频| 婷婷色操| 天天爽天天干| 九九激情| 五月天啪啪啪| 99精品在线观看视频| 99er精品| 国产片天天爽夜夜爽| 成人在线视频一区| 激情五月婷婷她| 男妓跪趴把舌头伸进我的嘴巴| 欧美激情综合色综合啪啪五月| 俺去也在线视频| 婷婷激情丁香五月天综合| 超碰在线观看成人视| 狠狠精品干练久久久无码中文字幕 | 天天爽天天日| 99在线小视频| 亚洲成人乱码av网站| 91热爆在线| 中文久久婷婷| 久婷久婷| 久久激情五月天| 亚洲视频久久| 91九色中文| 色99免费视频中文| 六月婷婷视频| 97超碰在线免费观看| 91精选国| 99视频网址| 天堂在线婷婷| 玖玖五月丁香| 在线成人网站| 六月婷婷网| 色999亚洲人成色| 99操中文视频| 丁香婷婷偷拍| 5月丁香六月婷婷| 99re这里有精品手机在线| 99热6这里只有精品6| 欧美97色| caobi四区| 五月天婷婷激情干干| 天天日夜夜B久久| 九九热在线观看6| 青青.com| 99热这里只有精品热| 久久婷婷在线| 久久99精品久久久久久噜噜| 色色亚洲五月天| 97人人草| 人妻激情久久| 欧美精品999| 丁香五月成人| 五月丁香婷婷伊人| 九热视频在线精品15| 婷婷五月综合网| 玖玖爱资源站| 无码毛片992367| 思思网站| 超碰网站在线观看| 丁香五月天之婷婷影院| 久久人人妻| 熟妇人妻中文字幕无码老熟妇 | 五月婷婷激情网| 中文字幕成人| 91久女| 激情久久月| 98永久精品| 伊人超碰| 思思久久青草热| 99精品综合| 九月色婷婷| 亚洲精品V天堂中文字幕| 精品热九九| 日亚二欧美| 99免费成人网| 五月婷婷在线视频| 天天色色天天| 五月婷九九草| yazhou seshipin| http://www.sd-xiangsu.com/| XX久久| 日本乱子人伦在线视频| 久久99草五月婷婷| 丁香婷五月| 五月精品| 婷婷丁香色五月天| 五月婷婷深深爱爱| 精品网站:999WWW| www超碰| 丁香熟女乱| 国产亚洲99| 丁香五月a| 色5月婷婷| 成人av在线网| 久久伊人大香蕉| 天堂在线伊久| 久久五月天合网| 五月天亭亭俺也| 色情综合网| 九九超日本| 99在线观看视频蜜臀| 色五月欧美| 青草视频在线观看视频| 久久99久久99精品免视看婷婷| 色色色.com| 色伊人婷婷| 99在线资源视频| 五月天无码| 99久在线观看| 这里只有精品1| 色欧美一级| 色色婷| 狠狠干狠狠干| 成人VAV视频在线观看| 五月天成人网婷婷| 日韩人妻AV在线| 热中文字幕| 久热超碰91| yjzz亚洲国产| 99综合一区| 精品少妇人妻AV无码专区偷人| 丁香五月天堂| 热99在线| 99re熱| 人妻九九九九| 综合玖玖性爱免费视频| 久久婷婷五月| 在线区区区| 99无码视频| 大香蕉久久久| 99ri国产| 天天综合网、天天综合色| 婷婷人人操| 十区AV| 日本成人噜噜噜| 日韩AV在线免费| 天天操天天日天天操| 日韩av一区二区在线/日产精品久久久 | 人人爽在线视频综合网| 99激情视频| 丁香丁香激情网| 色综合色色| 五月丁香怕啪啪| 26uuu亚洲| 亚洲日韩国产黑丝黑丝AVAV一区二区三区| 婷婷五月激情丁香| 婷婷六月丁香1| 亚洲国产精品VA在线看黑人 | 色.五月综合网| 丁香五月激情婷婷激情| 色婷婷第四色| 99re思思热久久| 久久久久妻| 久久婷婷六月综合综合| 色五月成人在线| 婷婷丁香六月天激情四射网| 久色大| 黄网在线免费观看| 成人做爰A片免费看视频| 青青草蜜臀| 超碰人妻公开在线| 亚洲综合无码| 天天做天天爰天天爽天天无遮挡| 黄色AAAA韩国guochansanji| 五月婷婷影院| 色综合开心五月深爱五月| 五月丁香婷婷狠狠操| 综合久久人妻| 色情性爱视频网址| 伊人喵咪a V| 狠狠狠人妻| 五月丁香888| 五月天综合激情网| 五月婷婷丁香大陆免费| 中文字幕激情综合| 熟女人妻一区二区三区免费看| 99精品视频免费观看,| 亚洲视频另类| www.婷婷| 天堂网啪啪| 九九久久99| 久久99精品久久久久久三级| 性色做爰片在线观看WW| 色丁香五月| 色色成人網| 91操屁股| 538在线精品| 五月丁香偷拍| 69激情小说| 欧美内射AA| 久婷婷视平| 亚洲乱码w在线观看| 丁香五月天色综合| 3p久久| 欧美成人猛片AAAAAAA| 五月色影院| 亚洲综人色综网| 日本欧美999久久久三级片| 丁香久久| 成人视屏在线观看| 99久热这里只有精品| 成人五月天婷婷| 九色1区视频在线| 狠狠搞狠狠操| 婷婷丁香九月| 精品99视频| 色丁香婷婷美女视频网站| 婷婷久久性爱| 成人中文网| 九九热视频在线观看| 色婷婷婷婷| 青青草蜜臀| 婷婷丁香五月91| 久月久在线视频| 天天艹夜夜艹| 亚洲人妻av| 第五色色色婷婷| 色七色九九| 色婷丁香| 日韩欧洲亚洲| 翔田千里 50岁 无码| 色狠狠综合入口| 久婷婷久草| 欧美性生交XXXXX无码小说| a网站免费观看| 开心五月激情网| 青青草原99热| 夜丁香五月婷婷| 中文字幕丁香五月| 五月婷婷开心色伊人| 99热99ai| 久久精品爱爱| sS丁香五月婷婷| 亚洲激情在线| 九九国产精视频| 91 九色 熟女| 亚洲人成网亚洲欧洲无码久久| 色五月色图| 丁香六月综合激| 久久五月婷综合| 亚洲愉拍99热成人精品| 丁香五月开心七月| av首页在线| 欧美特大片黄| 影音先锋五月天婷婷丁香在线观看| 99国产在线精品视频| 人妻内射一区二区在线视频| 国产偷人爽久久久久久老妇APP | 日韩操啪| 亚洲99在线| 亚洲日比视频| 91成人看片| 99狠狠色| 99这里的视频都是精品| 六月丁香婷婷尤物| 久久五月天激情| 激情五月天小说| 综合五月婷婷| 97资源碰碰| 婷婷综合五月天| 99只有精品| 亚洲精品白浆高清久久久久久| 97在线观视频免费观看| 久久九九囯产| 亚洲天堂热| 99区视频| 婷婷五月天天天| 五月色婷婷影院| 亚洲第一综合| HD久久精品视频| 99热加勒比| 开心婷婷中文字慕| 丁香五月23111| 激情文学五月丁香六月婷婷| 久久综合激情| 538在线精品| 色五月婷婷伊人| 9色视频在线| 婷婷六月丁香激情综合| 99精品无码| 99视频| 99色在线观看视频者| 大香蕉人在线65| 婷婷在线观看五月天在线视频| 激情综合网 激情五月天| 色综合色色色| 大香蕉啪啪啪| 秋霞日本免费毛片A片| 精品在线| 婷婷五月天影视首页| 五月丁香六月色| 91夫妻网站九色| 67194中文在线| 五月婷婷丁香成人网| 青青草原99热| www99热| 操婷婷基地| 五月丁香爱婷婷深深| 色婷婷裸体色性在线| 九九久久99| 香港九九六区八区99| 永久思思热在线| 欧美α√| 激情人妻蜜夜系列区| 欧美视频五区| 五月天俺去也| 国产69久久久欧美黑人A片| 激情四射婷婷色色色| 爱射综合| 99热这里都是精品| av最新在线| 人妻videos人妻高清| 丁香九月综合激情| 综合色视频| 色播五月丁香婷婷| 99热97| 夜夜爱爱亚洲| 丁香六月婷婷综合在线| 成人无码髙潮喷水A片| 五月天综合久久丁香91| 99精品大片| 国产日产亚系列精品版优势| 人人干人人干骚美女| 伊人玖玖网| 人碰91| 天天视频亚洲| 色插人人| 五月天色网站| 久久六月婷婷| 婷婷五月AV| 五月婷婷六月激情| 五月丁香久| 婷婷五月丁香欧洲| 精品久热69| 大香蕉AV电影在线| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| www.天天干| 久99| 婷婷五月天基地| 综合激情啪啪| 中文幕无线码中文字蜜桃| 热99这里只是精品| 99激情视频| 综合天天综合| 伊人久久艹| 婷丁五月| 婷婷丁香激情五月天色色色| 婷婷色五月天综合网| 亚洲视频在线观看| 亚洲久久婷婷丁香五月天| 欧美成人精品三区综合A片| 视频这里只有精品| 日韩丰满少妇无码内射| 色播五月婷婷综合| 综合福利网| 五月天狠狠干| 日韩无码性爱| 久99视频在线观看| 精品久色| 北京熟妇搡BBBB搡BBBB| 日日天天天| 久爱综合| 久久久免费精彩视频| 99色五月| 91久久婷婷| 开心五激情网| 97色一二三| 手机激情网| 欧美日韩精品一区二区三区钱| 婷婷狠狠操| 99在线视频色版| 色99在线| 九色色| 77777亚洲午夜久久| 丁香伊人网| 五月的婷婷六月丁香| 91女人18毛片水多国产| 影音先锋91| 天天玩夜夜操天天爽| 亚洲精品V天堂中文字幕| 丁香五月婷婷成人网| 超碰在线播放免费观看| 五月丁香综合在线| 精品久久久人妻| 丁香色六月婷婷| 乱岳熟女50岁| 色婷婷精品视频| 久热这里这里有精品| 啪啪日本欧美| 日韩人妻无码精品| 日本欧美成人片AAAA| 久久机只有这里精品| www.AV在线| 99色视频| 激情六月色| 婷婷五月成人有| 麻豆精品| 亚洲亚洲人成综合网络| 国产免费AV在线| 激情综合婷婷| 久久五月网| 欧美日韩成人h| 99这里有精品视频| 婷婷五月天香蕉| 婷婷导航| 六月婷婷视频| 五月天婷a在线| 成人片在线播放| 五月丁香婷婷激情视频| 亚州视频九九99| av色婷婷| 久久精品五月| 尤物一区二区| 91超级碰碰| 97色在线观看视频| 人妻久久久久久| 欧美婷| 五月天日日操夜夜操 | 五月婷婷人妻| 丁香五月婷婷六月婷| 91免费看片| 亚洲色频| 男人大jjc女人免费视频| 激情五月婷黄版| 亚洲va欧洲va国产va不卡| 五月丁香好婷婷姑娘综合网| 综合色情网| 亚洲 欧洲 国产 伦综合| 亚洲日韩一页精品发布| 亚洲综合另类| 操人91| 中文字幕成人| 午夜色婷婷| 伊人网啪啪| 五月天婷婷爱| 天天综合亚洲| 五月丁香久久久日婷婷久久婷婷日| 人妻AV在线| 久久女人天堂| 久婷婷婷| 六月丁香大香蕉| 激情伊人网| 极品九九九九九九| 天天操中文字幕| 久久亚洲天堂| 嫩草视频观看| 九九综舍久久| 久久性刺激| 日本久久超碰| 91婷婷丁香五月天免费视频网站| 大香蕉人妻| 99热偷拍| 《诡秘之主》在线观看 | 深爱五月天 开心网| 天天人人天天爽| 婷婷5月天av| 丁香婷婷六月天| av性爱在线| 婷婷色激情五月天| 99热成人| 五月婷在线观看| 中文字幕永久在线| 丁香六月婷婷久久综合| 99色在线观看视频者| 丁香深五月婷婷| 91大神在线免费看视频全集男男一起操| 色婷婷人人| 91岛国片| av在线资源| 凹凸探花电影| 五月天精品综合| 色婷婷亚洲婷婷在线观看| 影音先锋天天日| 久久婷婷综| 丁香五月AV| 亚洲日韩成人三级av| 婷婷五月丁香国产| www.色9| 狠狠舔| 2023天天日夜夜爽| 无码人妻一区| 五月天综合网| 人人操婷婷| 操逼六区| 97婷婷丁香五月天激情图片| 婷婷 月 丁香| 97超碰综合| 色五月综合激情网| 欧美性猛交99久久久99| 99这里只有免费的精品| 狠狠色综合精品视频在线| 国产免费一区二区三州老师F1F1| 风流少妇A片一区二区蜜桃| 就爱日五月天| 日韩999| 色色色色色色色色色999| 五月婷婷视频| 中文字幕精品无码一区二区| 激情五月天啪啪| 色五月婷婷成人视频| 五月天天天色| 久热这里| 久久伊人9| jiqingtaose五月天| 亚美欧色影院| 五月丁香色综合| 婷婷激情四射五月天| www.maotanji.com| 开心五月深爱婷婷| 99超级碰免费视频| 99热加勒比| 我爱婷婷五月天综合88| 亚洲午夜av| 99热首页| 婷婷五月丁香色情| av中文在线| 日韩有码一区| 五月花成人网| 丁香五月AV| 人人操人| 五月丁香激情综合网官网| 九九热中文| 激情婷婷五月综合| 国产欧美婷婷五月| www.99热| 97精品自拍| 五月丁花六月丁香综合| 色欧美一级| 丁香六月婷婷综情欧美| 五月婷婷五月天| 日韩精品电影| 深爱激情69热| 色五月婷婷777| 丁香九月综合| 夜夜骑夜夜操| 丁香六月婷婷综合| 内射综合网| 男人天堂AV在线一区二区| 热久久视频99| 激情综合网激情五月婷婷| 九九精品片一| 色色无码| 五月婷婷 欧美| 婷婷五月天激情网| 婷婷五月电影院| 九九大香视频| 人妻视频在线| 91碰超| 婷婷丁香五月天影院| 五月天激情网站| 中文av在线观看| 天天爽天天摸人妻综合网| 欧美婷婷丁香社区在线播放| 五月婷婷精品视频| 欧美性爱专区| 热思思| 亚洲啪啪自拍| 天天操天天曰| 七月婷婷色香综合网| 五月婷婷丁香在线视频| 婷婷五月天淫荡| 婷婷五月天在婷| 影音先锋一区二区资源站| 久久机热这里只有精品| 婷婷五月超碰| 久久在线大香蕉| 九色自拍| 色五月AV| 久久婷婷精品| 99精品国产在热久久| 五月丁香婷婷五月色| 日本欧美成人片AAAA| 色婷婷五月综合在线| 五月婷婷久草| 天天插天天插| 91色久| 大香蕉啪啪啪| 人人做人人看人人摸| 久草热久草在线视频| 五月婷婷激清网| 激情五月天福利| 大香蕉欧美在线| 久久婷婷五月综合色奶水99啪| www亚洲无码| 色99热| 丁香五月网络网络| 天天操天天干天天射| 亚洲色婷婷| 激情五月天色色网| 狠狠干狠狠干| 婷婷开心激情五月激情网| 久婷婷久草| 色情综合| 这里只有国产精品在线| 亚洲无码激情| 狠狠草在线观看| 色婷婷丁香五月综合| 99热99极品观看| 玖玖在线视频| 久久九九视频| 婷婷五月天成人在线视频| 久操香蕉| a在线观看| 精品成人无码A片观看香草视频| 久久精品99久久久久久久久| 六月丁香网| 五月色亚洲| 麻豆科斗777| 欧美日朝成人| 亚洲AAA| 思思热久久婷婷五月天| www.婷婷com| 欧美在线操| 狠狠色狠狠色综合日日91| www.婷婷| 99这里都是精品6| 久久婷鲁| 婷婷她六月天| 亚洲欧美国产高清vA在线播放| 婷婷九九| 丁香婷婷久久五月天| 99碰超| 五月丁香六月婷婷综合网缴情| 99在线69| 色 噜噜 九月 婷婷| 婷婷五月天成人导航| 色综合色综合网| 婷婷导航| 热99一二三| 99热9| 五月丁香人妻| 丁香五月色情| 久艹大香蕉| 日韩色色视频www| 激情六月综合| 日韩精品电影| 呦呦v线| 五月人妻婷婷视频| 日韩国产在线精品| 婷婷九月色| 橾逼网| 麻豆AV一区二区三区| 狠狠色综合网| av色色国产| 中文字幕一色哟哟哟哟| 91久久久久久| 成人网在线视频| 九色在线五月婷婷网址| 六月五月丁香五月欧美| 丝袜激情网| 天堂伊人干| 色五月婷色彩免播放器| 丁香五月开心亚洲| 五月天开心色情网| 日熟女| 視频福利乱色| 99综合成人视频在线观看| 五月天激情久色| 碰碰女| 色婷婷在线播放| 六月丁香色色色| 中文字幕性爱视频| 人妻中文av| 在线99精品| 亚洲成人AV在线| www.爱婷婷.com| 91九色无码内射| 激情丁香久久| 久久天堂加勒比| 国精产品一区二区三区| 超碰激情五月| 九热久| 色色激情网| 久久综合中文| 性爱综合网| 婷婷亚洲五月丁香综合在线| 思思视频精品| 亚洲99手机免费看视频| 丁香六月激情蜜桃| 日日色综合| 第四色五月婷婷| 996热re视频精品视频| 婷婷五月丁香综合| 五月婷视频| 超碰免费人| 99视频日韩| www.激情com| 538任你爽| 久久色五月天| 超碰精品手机在线| 五月激情五月婷婷五月天在线| 欧美va在线观看| 五月色丁香| 99激情| 久久五月婷婷综合网| 94干大香蕉| 天天综合网91| 99在线观看精彩视频| 99热综合在线观看| 丁香五月天电影| 五月丁香免费视频| 色狠狠综合| 婷婷五月天99综合网站| 五月丁香激| 噜综合| 天天成人综合视频| 激情五月婷婷视频一区二区三区| 激情五月天 婷婷| 人与禽A片啪啪| 九九超碰人人| 丁香六月婷婷社区| WWW夜夜| 秋霞三及片| 亚洲成人在线免费| 610018岁成人视频| 免费播放片大片| 就99这里只有精品| 色婷婷www| 色色色图| 婷婷激情四射五月天| 91操操| 99热日韩| 狠狠爱婷婷丁香| 蜜桃成语时李时珍 免费| 欧亚中文A V| 久久这里只有精彩| 六月丁香五月激情网| 丁香五月欧美激情| 五月婷三级片| 九九RE视频在线精品| 久久精品视频9| 丁香六月情| 人人操操97| 亚洲成人色五月婷婷综合| 99热成人精品网站| 精品无码久久久久久久久| 色婷婷玖玖影院| 亚洲天堂AV免费片| 婷婷五月天激情网| 亚洲视频在线观看区| 色热久资源| 99成人免费热视频| 99综合| 国产操B视频| 五月丁香亭亭激情操逼网| 日韩操人| 99热都是精品| 日本黄色三级片内射| 91爱啪啪| 五月天婷婷綜合院| 九九色插| 久久久久综合激动五月天| 色啪网| 色情婷| 久久久精品人妻录| 婷婷丁香六月天| 黄色aaaaa| 99.N在线视频| 五月婷婷精品视频| 五月综合色播播丁香婷婷| 99色视频| www。五月天激情| 久久人人九| 九热视频精品| 亚洲色情在线| 久久大国产香蕉| 森林影视大全,最好看的2019年视频 | 丁香久久| 五月五婷婷网| 日韩色色视频| 99在线69| 另类视在线| 91色碰| 五月天婷婷视频小说| 99操不停| 日日日日操| 日本天堂网站99| 五月色精品| 成人国产欧美大片一区| 森林影视大全,最好看的2019年视频| 狠狠草狠狠草| 色色五月天激情| 激情伊人| 国产 码在线成人网站| 激情综合网址| 五月丁香婷婷综合久久| 超碰成人电影| 久久婷婷精品| 五月婷婷之综合激情| 婷婷天堂综合| 五月丁香激情综合| 九九视频网| 婷婷99狠狠| 玖操97| www九九免费视频| 六月天丁婷婷| 丁香花操逼| 国产激情综合五月久久| 色五月婷婷伊人| 六九色综合婷婷五月天| 色噜噜狠狠色综合成人网| 99在线热| 国产色色在线| 精品国产乱码久久久久久免费| 无码激情精品色婷婷久久久久| 成人龟情网丁香五月| 99精品免费欧美小视频| 伊人玖玖婷婷| 久久婷婷色| 五月婷婷人人人操| 大香蕉九九| 啪啪激情网站| 亚洲欧洲小视频9| 婷婷久久亚洲| 色之综合网| 婷婷色五月91啪啪| 五月天激情国产综合婷婷婷| 婷婷五月天奸女| 婷婷激情五月天激情在线| 蜜臀久久99精品久久久久久酒店| 天天色综合图片| 婷婷色在线视频| 另类在线| 色婷婷色婷婷五月| 五月婷婷综合社区| 五月丁香色婷婷| 丁香五月天成人| 久久久久久99精品无码| 人妻视频在线| 这里只有精9| 亚洲区1| 超碰在线观看99| 五月丁香婷中文| 伊人婷婷91| www.婷婷五月天| 婷婷夜夜操| 91男同| 婷婷五月丁香基| 中文无码婷婷| 五月婷婷插一插| 亚洲婷婷婷| 日韩黄在免| 爱婷婷五月| 最新av在线观看| 亚洲V国产V欧美V久久久久久| 色婷婷综合影院| 丁香六月亚洲| www综合久久| 在线18av | 久青操| 婷婷六月激情丁香| www.99久| 婷婷五月综合中文字幕| 婷婷久久综合久| 成人色五婷婷| 狠狠狠狠免费| 玖玖激情五月天| 亚洲黄网在线| 人妻久久久久久久 | 狠狠色婷| 国产精品美女| 五月丁香 久久久| 任你爽精品免费视频6| 国产一级片| 婷婷色片| 色五月天天| 欧美丁香五月97色| 91a片爽| 国产精品久久久久久久久久| 超碰不卡在线| 色欲天天综合| 99热这里只有精品23| 国产67194| 69综合在线| 激情综合五月丁香六月婷婷| 可以免费观看的AV| 激情人妻综合| 天天爱天天操| 亚洲 六月 综合| 超碰九色| 婷婷激情五月天小说| 日韩性爱AV| 婷婷激情五月综合| 天天狠天天叉| 91碰在线| 婷婷丁香色情| 天天艹夜夜艹| 婷婷中文字暮| 久久五月激情| 久色中文| 亚洲碰碰碰| 久久免费丁香| 丁香狠狠操| 日韩激情网站| 五月婷婷激情在线| 91av传媒高清在线视频网| 国产精品18久久久| 五月天婷婷基地| 久久婷婷五月| 婷婷五月综合在线| 婷婷六月激情| 夜夜躁爽日日| 五月天色五月| 人人爱人人草| 思思99久久| 日韩久热| 亚洲av无码精品色午夜| 婷婷丁香五月91| 人人操 色| 狠狠色综合久久久久| 久9久视频精品| 超碰2021| 大天天伊人| 九九热精品99| 伊人久久大香线蕉av最新| 久久婷婷五月天懂色| 91色婷婷综合久久中文字幕二区| 色九月婷婷| 天天搽天天射| 99久久国产宗和精品1上映| 热99久久这里只有精品| 久热这里只有精品66| 婷婷五月综合在线| 26uuu四色| 婷婷五月天影视| 四色AVwww| 亚洲婷婷欧美婷婷| 原琪琪色影院| 成人精品在线| 欧美成人猛片AAAAAAA| 丁J香六月首页| 91无码高清| 五月天婷婷影院| 色五月在线| 六月婷婷网站| 久久色五月天| 日本欧美成人片AAAA| 三年高清大片免费观看国语| 香蕉99网| 国产精品99久久久久久猫咪| 久久五月六月| 五月天激情.com| www婷婷| 国产成人+综合亚洲+天堂| 熟女人妻视频| 二级黄色毛片| 色热久资源| 草操网| 久久99网| 99亚州综合精品成人网| 色婷婷很很十八禁| 亚洲久久日| 天天日日天天| 激情文学五月丁香六月婷婷| 狼友视频在线观看18| A片女女女女女女BBBB| 9999热精品| 国产五月丁香在线| 思思久热6| 久久精品4| 亚洲黄网AV| 九热久| www,婷婷五月天,com| 123草逼网| 久碰视频| 国产婷婷久久| 精品视频这里只有精品| 婷婷五月情| 色五月婷婷在线| 五月婷婷深深爱| 五月婷婷色丁香| 中文字幕不卡+婷婷五月| 久在线88综合| 97人人操| 99热.com| www色色com| 久久综合影院| Jh7Uf088VHafNm| 天天干夜晚夜操| 五月天怕怕| 欧美在线看| 99精品亚洲| 成人做爰A片免费看视频| 五月天激情久久| 五月天婷婷激情春色小说| 婷婷五月在线视频| 成人短视频在线免费观看| 五月丁香婷婷人体| 色999五月色| 久久久色情| 五月婷婷乱| 色五月婷婷网| 色丁香五月天| 噜噜色噜噜网| 老师高潮流白浆喷水的A片| 五月天激情综合在线| 99在线免费视频| 91大屁股| 亚洲久热| 播五月丁香三月婷婷| 五月天丁香婷婷网| 五月天婷婷久久日| 操日挥操日日| 桃色成人网| 久久无码激情视频| 婷婷九月色| 六月丁香停| 99爱在线视频| 99热在线播放精品| 色情免费视频播放| 91超级碰碰碰| 综合九九中文字幕| 五月六月婷| 五月婷婷综合天天操| 色婷激情网| 丁香五月激情综合| 国产永久一二一起草| 久草狼人| 91操女| 精品皮股午夜AV| 97超级啪啪在线观看| 日韩欧美四五区| 成人做爰A片免费看视频| 激情小说五月天社区丁香| 久热免费| 97极品在线| 这里只有精品视频| 99九九玖玖| 欧美色久| 掩去也综合五月视频| 欧美精品99久久久| 色综合夜夜|