抓包的工具有很多,浏览器的开发者工具、Fiddler、Wireshark等等,这里以Chrome的开发者工具举例。
删除Cookies
方便分析,我们先打开开发者工具,将博客园的cookie删除

登录页Cookie
博客园的登录页面是passport.cnblogs.com/user/signin,直接访问这个页面,然后看网络请求

可以看到先访问了passport.cnblogs.com/user/signin,状态码是302,又重定向到passport.cnblogs.com/user/signin…,还是这个页面,只是多加了参数AspxAutoDetectCookieSupport=1,分别看这两个请求的返回内容


访问第一个请求时服务器向浏览器返回了 AspxAutoDetectCookieSupport 和 SERVERID 两个Cookie,而第二个请求,也是返回了 SERVERID 这个Cookie,暂时认为这个请求对我们没有帮助
登录请求
输入账号密码,然后点登录,看请求的报文

有几个需要注意的地方
Content-Type使用了application/json的方式- 登录页返回的两个Cookie要带上
- 有个
VerificationToken头 - 账号密码的参数分别是
input1和input2,并且做了加密处理,remember是记住密码 - 实践发现
X-Requested-With也是必须的,否则登录报错
要知道VerificationToken和input1、input2值的由来,我们定位到登录按钮的事件

调用了signin_go函数,找到这个函数,看它所做的事情

代码很清晰,到这里,除去验证码的部分,结合请求报文,登录的过程已经很清楚了
- GET请求passport.cnblogs.com/user/signin页面,拿到
AspxAutoDetectCookieSupport和SERVERID两个Cookie - 使用了 JSEncrypt 根据RSA公钥加密用户名与密码作为
input1、input2参数 - 设置请求头
ContentType和VerificationToken还有X-Requested-With,并带上前面两个Cookie - 将
input1、input2、remember转换为json,发送POST请求,返回的JSON数据success为true表示登录成功 - 登录成功后返回
.CNBlogsCookieCookie,也就是用户身份的Cookie
模拟登录
为了验证我们的分析,使用Postman工具模拟一下登录的过程
设置4个必要的请求头

因为Content-Type是application/json方式,所以表单使用raw,填入登录的json参数

然后提交,返回了登录成功的JSON
