使用浏览器访问或调试微信公众号(跳过微信认证)
因為大部分公眾號web應用實際登錄都是使用用戶微信認證登錄,下文主要是提供一種方法使在PC端使用任意瀏覽器繞過微信認證完成登錄,后面就可以在瀏覽器中使用或調試web應用。
應用服務器(我們自己的第三方應用程序)需要知道是誰在訪問服務(登錄),而在微信公眾號應用中登錄一般都是使用靜默的oauth2,由微信認證用戶的真實性,并通知應用服務器當前用戶是哪位(openid)
那能不能跳過微信應用程序由第三方來模擬(模擬微信應用程序,騙過微信oauth2服務器)完成oauth2授權?
當然如果您本身就是公眾號的管理者那可以直接設置自己的帳號為該公眾號開發者帳號,作為開發者帳號其實這些都不要去關心,因為你可以直接使用微信開發者工具去完成授權,然后在開發者工具中進行調試
但是即便擁有公眾號開發者權限,大部分基于UI的自動化測試工具無法控制微信開發者工具,基本上都是控制瀏覽器本身,最終也還是需要在瀏覽器中提供驗證。
上圖是展示的一個一般情況下的微信授權過程。(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842)
請求1:一般就是一個對公眾號網頁的范圍,一旦我們自己的應用服務器發現這個用戶授權失效(沒有相應cookie,或cookie對不上),那服務器返回302,要求用戶(微信APP內置 瀏覽器)跳轉至微信授權服務器 『https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect』 這里有個關鍵信息appid,應用服務器會把appid帶上,以便微信授權服務器識別是那個公眾號來授權了
請求2,3:用戶按302的指示向微信服務器進行授權,在2,3中微信用戶不僅把之前的appid帶上,還帶上了uni(user information 正常也只在微信跟微信服務通訊中用),跟一個關鍵的key。(這個key值每次授權不不一樣,所以保存下來重放也無效),猜測key是由微信應用程序根據用戶信息,公眾號信息加密合成的,外部應用程序也是很難仿照。第2步 的 appid與uin向微信服務器換取了uuid,第3步,微信返回了關鍵的code參數,并通知微信應用程序301到 我們的應用服務的地址。 (實際上一旦應用服務器拿到code,后面的步驟就可以不一定一定需要微信APP參與了)
請求4:用戶帶著微信返回的code請求我們的應用服務器,我們自己的應用服務器拿到code后向微信授權服務器換取網頁授權access_token 『https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code』 注意這個請求需要帶上secret,即表示這個請求只能由我們的應用服務器來完成(secret不能公開)
完成請求5后我們的應用服務器已經拿到openid,access_token ,簡單的應用取得openid后即已經能確定用戶的身份了。如果需要用戶的詳細信息可以使openid,access_token用進一步向微信服務器請求
結束:一般應用服務器使用用戶的openid標識用戶,所以得到通過用戶請求中的code獲取到openid后即表示用戶已經被認證,應用服務器此時通常在這個請求的response中加入Set-Cookie將登錄信息寫入微信瀏覽器(或者對之前的cookie的認證信息標記為有效)
通過上面簡單的步驟可以看出來無論是客戶端(微信)還是應用服務器都有私有的類似secret的數據,來保證各自的不可偽造性。所以無論是想要偽造誰都不是那么簡單
但是一旦微信oauth2完成后的安全性就會變成一般瀏覽器的一樣,應用服務器驗證用戶基本上都憑借請求中帶的含有十分信息的cookie。也就是說我們只要能在微信公眾號(服務號)應用完成認證后將相應的cookie取出并寫入瀏覽器(或者其他調試工具),那瀏覽器就可以通過后面應用服務器的身份驗證(無論當前網頁使用怎樣的域名甚至是前端人員的本地頁面)
那現在就是2個步驟:
獲取網站授權完成后的cookie(cookie可能會有很多,而我們其實不用關注哪個是認證用戶信息用的,全部拿過來就行了)。對于cookie的獲取其實還是比較方便的,如果被設置為微信公眾號的開發者可以直接使用微信web開發者工具,調試信息包括cookies也都會有,如果不是開發者無法進入調試模式也沒有關系,任何針對http協議及更底層協議的抓包工具都可以查看request所攜帶的cookie信息。
然后就是將cookies信息寫入瀏覽器,如果是瀏覽器可以在Console中修改cookies,不過要求必須必須帶有js執行能力的控制臺的瀏覽器。還是一個就是通過response的head頭 Set-Cookie來完成cookie的寫入及修改。
下面接受一種更簡單的步驟完上面2個步驟
使用Fiddler插件freeCookies 完成cookies的操作 (下載及使用說明: https://www.cnblogs.com/lulianqi/p/9481203.html)
直接在手機微信上打開公眾號(訂閱號)頁面,使用fiddler抓取指定網站任意頁面請求(也可以使用PC版微信打開公眾號頁面)
進入free cookies 標簽頁(free cookies 插件下載地址 使用說明)
選擇目標域名網址的任意頁面請求(注意圖片及js資源可能不含有cookies信息)點擊Get Cookies獲取cookie (如下圖)
打開本地調試頁面(也可以是其他域名或是同一域名)
填寫目標地址到UrlFilter,勾選Injeck Cookies,在瀏覽器中對該站點任意請求進行刷新操作(cookie 寫入完成后建議取消勾選,或者不要勾選Inject Always)
寫入cookies后就可以看到頁面再與服務器的交互就已經完成了“登錄”
最后下圖展示一張京東到家公眾號應用直接在chrome,并完成了微信的認證登錄。(實際是手機微信的登錄后將cookie再寫到Chrome里,這里jd需要在瀏覽器中修改UA,chrome本身就可以直接修改UA)
以上使用到的Fiddler插件freeCookies 說明見https://www.cnblogs.com/lulianqi/p/9481203.html
源代碼見github:https://github.com/lulianqi/FreeCookies
總結
以上是生活随笔為你收集整理的使用浏览器访问或调试微信公众号(跳过微信认证)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用jave2进行音频处理
- 下一篇: flask-session总结