由于大部分公众号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前端