Sina微博 SSO登陆过程分析

Sina SSO登陆过程分析

近日研究了Sina CAS的登陆过程,发现其实sinasso实现了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.jspweb1重定向到sso.xxx.com/login.jsp

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

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

二,Sina SSO

Sina实现了跨域名的统一登陆,本质也是基于Cookie的。如果用户禁用Cookie,那么无论如何也是登陆不了的。例如:Sina SSO服务器是login.sina.com.cn/sso/login.php

,微博登陆地址为weibo.com/login.php。通过回调函数和iframe实现了跨一级域名的登陆。

认证过程具体流程:这里只介绍用户从未登陆过。

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

2,  用户输入用户名称。输入完毕后,当用户名输入框焦点失去的时候,页码通过ajax向服务器login.sina.com.cn/sso/prelogin.php发送请求,参数为user(刚刚输入的用户名)。服务返回server time nonce 认证,通过回调函数写入到javascript变量中。

3,  用户输入密码,点击登陆,页面POST 请求(注意是ajax请求,并不是login.php发送的),

login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.12),请求的发起的页面是weibo.com/login.php中的一个不可见iframe页面,参数为第二步得到的servertime nonce ,已经用户名称和加密的密码。返回种入Cookie  tgtlogin.sina.com.cn下。同时修改iframe地址为weibo.com/ajaxlogin.php?ticket=XXXXXX,注意ticket非常重要,这是用户登陆和服务的凭证。

4,  iframe 访问weibo.com/ajaxlogin.php?ticket=XXXXXX,用户登陆,返回种入cookie.weibo.com下,记录用户登陆信息。

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

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

 

重点:交互过程和密码加密算法分析。

 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请求。

 

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
好的,我可以为您提供一个简单的Python代码示例,用于模拟登陆新浪微博。请注意,这只是一个示例,具体的实现方法可能因为新浪微博的更新而有所不同。 ```python import requests from lxml import etree # 定义登录函数 def login(username, password): # 创建一个Session对象,用于保持登录状态 session = requests.Session() # 访问登录页面,获取一些必要的参数 url = 'https://login.sina.com.cn/signup/signin.php' response = session.get(url) html = etree.HTML(response.text) vk = html.xpath('//input[@name="vk"]/@value')[0] action = html.xpath('//form[@id="SinaLoginform"]/@action')[0] # 构造登录请求 data = { 'username': username, 'password': password, 'vk': vk, 'returntype': 'META', 'encoding': 'UTF-8', 'entry': 'sso', 'gateway': '1', 'from': 'null', 'savestate': '30', 'userticket': '0', 'pagerefer': '', 'wsseretry': 'servertime_error', 'pcid': '', 'door': '', 'appkey': '1', 's': '1', 'vsnf': '1', 'su': '', 'service': 'sso', 'servertime': '', 'nonce': '', 'pwencode': 'rsa2', 'rsakv': '', 'sp': '', 'sr': '', } response = session.post(action, data=data, allow_redirects=False) # 获取重定向链接,访问该链接即可完成登录 location = response.headers.get('Location') session.get(location) return session # 使用示例 if __name__ == '__main__': username = 'your_username' password = 'your_password' session = login(username, password) # 使用session对象访问需要登录后才能访问的页面 response = session.get('https://weibo.com/') print(response.text) ``` 请将 `your_username` 和 `your_password` 替换为您自己的用户名和密码。此外,需要安装 `requests` 和 `lxml` 两个库,可以使用 `pip` 命令进行安装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值