微博登录过程分析

来源:互联网 发布:photoshop 2016 mac 编辑:程序博客网 时间:2024/05/23 14:27

http://blog.csdn.net/pipisorry/article/details/47904355

如果要想获取微博中的数据,最重要的第一步就是模拟登录了。这里讲解一下微博登录的流程,有助于用代码实现。

Sina CAS的登陆过程

其实sina的sso实现了yale-CAS并且添加一丁点新的东西,基本认证过程交互流程仍然未变。其独创的一点是实现了Ajax单点登陆,比较牛。实现原理是iframe+ javaScript回调函数。

初级SSO

初级的SSO,就是在同一个顶级域名下,通过种入顶级域名的Cookie,来实现统一登陆。例如:

单点登陆地址:sso.xxx.com/login.jsp

应用1: web1.xxx.com/login.jsp

应用2: web2.xxx.com/login.jsp

应用3: web3.xxx.com/login.jsp

登陆流程:

情况一:(用户从未登陆)

1,  用户访问web1.xxx.com/login.jsp,web1重定向到sso.xxx.com/login.jsp

2,  用户输入验证,成功。sso.xxx.com种入.xxx.com域Cookie的tokenid,重定向到web1.xxx.com/login.jsp,web1.xxx.com访问.xxx.com域Cookie的tokenid判断出已经登陆,系统登陆完成。

情况二:(用户已经登陆)

直接登陆。

Sina SSO

Sina实现了跨域名的统一登陆,本质也是基于Cookie的。如果用户禁用Cookie,那么无论如何也是登陆不了的。

Sina SSO服务器是login.sina.com.cn/sso/login.php,微博登陆地址为weibo.com/login.php。

通过回调函数和iframe实现了跨一级域名的登陆。

皮皮Blog

认证过程具体流程(用户从未登陆过)

1,  用户进入weibo.com/login.php

2,  用户输入用户名称。输入完毕后,当用户名输入框焦点失去的时候,页码通过ajax向服务器login.sina.com.cn/sso/prelogin.php发送请求,参数为user(刚刚输入的用户名)[通过抓包lz发现实际发送信息的地址为http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=*******&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1441503921772, *****就是你输入并经过js加密处理的用户名]。服务返回server time 和nonce 认证等postdata,通过回调函数写入到javascript变量中。

3,  用户输入密码,点击登陆,页面POST 请求(注意是ajax请求,并不是login.php发送的,http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)),请求的发起的页面是weibo.com/login.php中的一个不可见iframe页面,参数为第二步得到的servertime 、nonce 、用户名称和加密的密码。返回种入Cookie  tgt在login.sina.com.cn下。同时修改iframe地址为http://passport.weibo.com/wbsso/login?ssosavestate=1472919508&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=*****&retcode=0

Note: 1. 产生请求的原因:signin.php文件中的OnReady()函数添加了表单的OnSumbit处理函数 $("vForm").onsubmit = function(){return login();}; login()调用sinaSSOController.login()->sinaSSOController.loginMethodCheck()->sinaSSOController.loginByConfig() ->sinaSSOController.loginByIframe(),在loginByIframe()函数中新建了一个隐藏的loginForm,通过表单的Submit方法产生上述请求。

2. lz发现http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18))返回的内容是
...<script charset="utf-8" src="http://i.sso.sina.com.cn/js/ssologin.js"></script>
Signing in ...
<script>
try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/crosdom.weicaifu.com\/sso\/crosdom?action=login&savestate=1473040530","http:\/\/passport.97973.com\/sso\/crossdomain?action=login&savestate=1473040530","http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1"]});}catch(e){}try{sinaSSOController.crossDomainAction('login',function(){location.replace('http://passport.weibo.com/wbsso/login?ssosavestate=1473040530&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=ST-*****==-1441504530-gz-618D3C7ABA8F37A5BEE36BADAB7A88DF&retcode=0');});}catch(e){}
</script>...注意到这里面有4个返回地址crosdom.weicaifu.com...、passport.97973.com...、passport.weibo.cn...、passport.weibo.com...,其中passport.weibo.com...才是我们要的,地址中还带有ticket,其它3个lz真不知道干嘛用的。

4,  iframe 访问http://passport.weibo.com/wbsso/login?ssosavestate=1472919508&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%26sudaref%3Dweibo.com&ticket=*****&retcode=0,用户登陆,返回种入cookie在.weibo.com下,记录用户登陆信息。

5,  通过js再次访问weibo.com/login.php,因为cookie已经写入,登陆成功,服务器发送302,重定向到用户主页面。Weibo.com/userid。

6,  至此,登陆过程完成。

可以看到,上面所说的页面请求都可以通过fiddler2抓包得到


交互过程和密码加密算法分析

 1, 在提交POST请求之前, 需要GET 获取两个参数。
       地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
       得到的数据中有 "servertime" 和 "nonce" 的值, 是随机的,其他值貌似没什么用。
2, 通过httpfox 观察POST 的数据, 参数较复杂,其中 “su" 是加密后的username, "sp"是加密后的password。"servertime" 和 ”nonce" 是上一步得到的。其他参数是不变的。
    username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1];
    password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。
    将参数组织好, POST请求。[Sina微博 SSO登陆过程分析]

Note: 后来新浪微博的加密方式改成两次SHA1加密再来一次RSA加密了。再后来新浪登录过程变为了RSA。

以后可能还会变化,但是各种加密算法在Python中都有对应的实现,只要发现它的加密方式,程序比较易于实现。

[新浪网站登录过程分析]

皮皮Blog


使用httpfox解析新浪微博的登录过程

新浪微博的认证流程:

1、这里在火狐下使用HttpFox工具抓取登陆的数据交互,打开HttpFox,用户进入weibo.com/login.php登陆页面,抓取得到数据如下:

image

我们用浏览器登陆weibo.com/login.php网页时,服务器在不断地跳转,从不同的位置给客户端返回所需的资源及稍后登陆所需的数据。我们需要找到对我们登陆所需要的信息,重要的交互记录如下:

image

选中的部分,从http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.18)站点位置GET得到的内容会在Content窗口显示,格式为Text/html,即:

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1387782050,"pcid":"xd-62049b61eeb94c62c92e4c4d10db7dcb4c7d","nonce":"DF8VR6","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":0})

servertime、nonce 就是登录时候需要使用的,用于POST信息的加密。

2、输入用户名后,当用户名输入框焦点失去的时候,页面将再次访问http://login.sina.com.cn/sso/prelogin.php,得到上步中类似的消息:

image

这些数据都是登录时要提交的postdata,其中新的servertime、nonce 等值用于稍后用户登录时使用的是这些数的最新值。

3、输入密码,点击登陆,页面POST请求如下:

image

分析向http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)提交的参数POST Data:

entry    weibogateway    1from    savestate    7useticket    1pagerefer    vsnf    1su    aG91YW5kbGlob21lJTQwZ21haWwuY29tservice    miniblogservertime    1387784432nonce    PH653Npwencode    rsa2rsakv    1330428213sp    04b4568a21646afc2418e86c99958ec09d3cf45c624404a96dd63a4f13a09384148af1b727d046ff17727f307460ff0b90db2a4d6c9d3ad1e1809b4756a002cf93129dcb0480b349dba2439db7874d0f32a7c0770d0f80360f6fa139d4e3f09bb2b50099b329cb2de5d59fdafc199dc7b3b2d731b43c5dd0948149fc6df4d624encoding    UTF-8prelt    101url    http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBackreturntype    META

su表示POST的账号,username经过了BASE64加密;password 经过了三次rsa加密, 且其中加入了 servertime 和 nonce 的值来干扰,sp为加密后的密码。

再看服务器的返回值,Type=text/html (NS_BINDING_ABORTED)而Result=(Aborted),Content窗口为:Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED),因为网页发生了重定向跳转,原网页中止,HttpFox没有捕获到返回值。通过Python程序可以得到返回值,如下:

<html>...<title>新浪通行证</title>...<script type="text/javascript" language="javascript">location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390380654&ticket=ST-MzQ4NzQ5NTYyMA==-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AF&retcode=0"); </script>...

我们关心的返回结果是script部分:location.replace(http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390380654&ticket=ST-MzQ4NzQ5NTYyMA==-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AF&retcode=0);      

因为,HttpFox检测到随后两步的跳转网址为:

image

蓝色:http://weibo.com/sso/login.php?ssosavestate=1390381500&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%2
6sudaref%3Dweibo.com&ticket=ST-MzQ4NzQ5NTYyMA==-1387789500-xd-710FAD84CC8AF2EE75FE5D197CD76234&retcode=0 
这一步上传url的值即为script部分(这里由于不是同一次登录,值不同但结构相同),retcode=0表示登陆成功,然后打开url跳转到下一步。

第二步:http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&sudaref=weibo.com

用户登陆成功,返回weibo.com的信息到客户端cookie中,记录了用户登陆信息。

4、接下来就是新浪的SSO(Single Sign-on)登陆了,就是在同一个顶级域名下,通过载入顶级域名的Cookie,来实现统一登陆。服务器会自动再次访问weibo.com(上图第四行),因为cookie已经写入,登陆成功服务器返回302,重定向到用户主页面。此后再访问微博中其他人的主页或使用微博的其他应用,服务器便可以通过cookie来检测用户的状态了。

当然,新浪的登陆方式未来可能发生改动。[解析新浪微博的登录过程]

from:http://blog.csdn.net/pipisorry/article/details/47904355

ref:scrapy模拟登录微博

网站常见的反爬虫和应对方法

现代浏览器的工作原理


2 0
原创粉丝点击