详细分析某个Oauth2认证过程&Python实现

笔记 711 字 大概 2 分钟 309 次
OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用代表用户获得访问的权限。同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。2012年10月,OAuth 2.0协议正式发布为RFC 6749

工具&环境

  1. Fiddler
  2. Python 3.7

流程分析

完整抓取登陆流程

使用fidder抓取整个登陆过程;
1.png

检查用户名,密码是否正确

首先我们来看第2个请求:
2.png
我们首先get /eams/login.action ,然后给出了一个 307 重定向 :
在返回头信息里,我们可以发现存在一个location 参数。
这个location是有用处的,所以我们记下它。
之后会被重定向到location中那个链接,注意其中的client_id参数

python实现代码:

firstheaders={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'}
firstreturn = requests.get('/eams/login.action',headers=firstheaders,allow_redirects= False)
secondurl = firstreturn.headers['Location']

!!!:为了防止自动跳转,在参数中需加入 allow_redirects= False

接下来看第3个请求:
3.png
通过get 上一个返回的location,同样返回了一个location:
接着重定向为第二个location
注意 snclient_id 参数,我们需要把它们取出来。

python实现代码

secondreturn = requests.get(url=secondurl,headers=firstheaders,allow_redirects= False)
thirdurl = secondreturn.headers['Location']
returnsn = re.findall('sn=(.*?)&',thirdurl)
client_id= re.findall('client_id=(.*?)&',thirdurl)
for i in client_id:
    client_id=i
for i in returnsn:
    sn = i

接下来看第4个请求:
4.png

第5个请求就是相关资源的读取。
通过这三步,我们已经打开了登陆认证界面了。
5.png
第6个请求直接越过,没啥好看的:
主要就是验证你是否带入了clientid

看第7个请求:
6.png
/cgi-bin/login2?method=login post数据
post的数据中包括sn和你的账号密码以及客户端类型
服务器返回一个json数据。
json数据中包含errorMessage 为空就是登陆成功,以及一个全新的clientId 。
在接下来的请求中我们只需要传入 snclientId

python实现代码:

data = 'sn=%s&type=pwd&username=%s&password=%s&code=&userAgent=pc'%(sn,user,password)
secondheaders={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0','Content-Type': 'application/x-www-form-urlencoded'}
fourthurl='/cgi-bin/login2?method=login'
checkreturn = requests.post(url=fourthurl,data=data,headers=secondheaders)
json1 = json.loads(checkreturn.text)
clientid = json1['clientId']
splicingurl(sn,clientid)

COOKIE段的获取

来看看第8个请求:
7.png
在get 请求中带入了 snclientid
返回set-cookielocation
记下set-cookie
然后 307 重定向为 location。

python实现代码:

thirdheaders={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0'}
firstgetcookieurl = '/oauth2/authorize?sn=%s&client_id=%s&response_type=sn&redirect_uri=http://jwglnew.hunnu.edu.cn/eams/oauth2-login?backUrl=/login.action'%(sn,clientid)
firstgetcookiereturn = requests.get(url=firstgetcookieurl,headers=thirdheaders,allow_redirects= False)#禁止跳转
secondgetcookieurl = firstgetcookiereturn.headers['Location']
setcookie = firstgetcookiereturn.headers['Set-Cookie']

接下来我们看看第9个请求:
8.png
照样get 前一个返回的location,在headers中的cookie中似乎带入了上一个set-cookie,不过在后面的代码编写中似乎没有起到什么作用:
headers中返回内容:
Set-Cookie中存在两个参数(C2AT 和 C2RT)
照样返回一个location,并302跳转到location
我们取出来,在下个请求中会很有用。

python实现代码:

secondgetcookiereturn = requests.get(url=secondgetcookieurl,headers=thirdheaders,allow_redirects= False)
thirdgetcookieurl = secondgetcookiereturn.headers['Location']
C2AT1 = secondgetcookiereturn.headers['Set-cookie']
C2AT2 = re.findall('C2AT=(.*?);Max-Age',C2AT1)
C2RT1 = re.findall('C2RT=(.*?)Max-Age',C2AT1)
for i in C2AT2:
    C2AT = i
for i in C2RT1:
    C2RT = i

接下来我们看第10个请求:
9.png
我们可以看到在headers的cookie中一定要带入上一次请求的C2AT和C2RT。
在返回头中存在Set-Cookie
取出 JSESSIONIDGSESSIONID

python实现代码:

fourthheaders={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0','Cookie': 'C2RT=%sC2AT=%s'%(C2RT,C2AT) }
thirdgetcookiereturn = requests.get(url=thirdgetcookieurl,headers=fourthheaders,allow_redirects= False)
SSIONID1 = thirdgetcookiereturn.headers['Set-cookie']
SSIONID2 = re.findall('JSESSIONID=(.*?); Path',SSIONID1)  #JSESSIONID 和 GSESSIONID 相同 注意一个空格
for i in SSIONID2:
    SSIONID = i

到这里为止,就已经完成了cookie的所有组成部分。

COOKIE的拼接

python代码实现:

finallyheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0','Cookie': 'C2RT=%sJSESSIONID=%s;C2AT=%s;GSESSIONID=%s'%(C2RT,SSIONID,C2AT,SSIONID) }  #拼接cookie

headers中的cookie已经表示你已经成功登陆。
在其它页面的请求中带入此headers即可。

PS:代码有点糙,如果文章中存在错误或不足之处,请予以纠正,感谢!

文章目录
END

本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。

仅有 1 条感想

  1. insulsido 游客 回复
    2021-07-30 18:46

    cialis