由於大部分公衆號web應用實際登陸都是使用用戶微信認證登陸,下文主要是提供一種方法使在PC端使用任意瀏覽器繞過微信認證完成登陸,後面就能夠在瀏覽器中使用或調試web應用。
應用服務器(咱們本身的第三方應用程序)須要知道是誰在訪問服務(登陸),而在微信公衆號應用中登陸通常都是使用靜默的oauth2,由微信認證用戶的真實性,並通知應用服務器當前用戶是哪位(openid)
那能不能跳過微信應用程序由第三方來模擬(模擬微信應用程序,騙過微信oauth2服務器)完成oauth2受權?
固然若是您自己就是公衆號的管理者那能夠直接設置本身的賬號爲該公衆號開發者賬號,做爲開發者賬號其實這些都不要去關心,由於你能夠直接使用微信開發者工具去完成受權,而後在開發者工具中進行調試
可是即使擁有公衆號開發者權限,大部分基於UI的自動化測試工具沒法控制微信開發者工具,基本上都是控制瀏覽器自己,最終也仍是須要在瀏覽器中提供驗證。
請求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抓取指定網站任意頁面請求(也可使用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 說明見 http://www.javashuo.com/article/p-cfyvbilx-na.htmlhtml
源代碼見github: https://github.com/lulianqi/FreeCookies前端