【摘要】 详解描述使用账号登陆华为云流程,并给出GO语言代码实现,来获取登陆后返回的Cookies。这样后续请求华为云接口,就可以做到直接访问。同时讲解了SSO单点登陆流程,辅助理解SSO原理。
一、背景
测试需要(或者爬虫抓取),在往需要登陆的网页发送请求时,是需要携带Cookies的,否则会被禁止访问。然而Cookies字段则是在使用用户名+密码登陆后才能获取到的。
本文介绍如何使用Go语言实现登陆,并将Cookies保存下来,并在后续请求中继续使用的详细实现。
二、判断交互流程
查找资料,发现SSO单点登陆流程大概长这样:
-
首次访问
2. 重定向到SSO服务器
3. 再次访问
更学术一点,具体协议上的交互如下:
(客户端) (SSO服务器) (目标网站)
资料来源:https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol.html
三、验证交互流程
直接打开Chrome,使用F12调试模式,将整个登陆流程记录下来。
-
发送登陆请求:
包含两个东西: (a)SSO服务器。 (b)登陆成功后,继续访问的网址。
2. 发送登陆请求,所带的账号信息:
3. SSO服务器返回结果:
这个是用Postman发送登陆请求后获得的响应Body体。
顺便提一下这里两个疑问:
(a)CAS协议里面,登陆成功后回到原来网站,是用重定向302响应。而华为的SSO却是在响应Body里的。
(b)Chrome记录里面,没有记录下这个响应。只能在Postman里面才看到响应Body。(甚是奇怪,浪费我很久)
4. 继续访问原来网站。
注意,这里就带上登陆后给的“信物”了,?ticket=xxxx 。
响应里面带了两个东西:
(a) 告诉你后续访问带的Cookies,比如SessionID,agencyID。
(b)继续用不带信物,但是带上Cookies再次访问一次。
5. 根据重定向再次访问网站
(a)这里又返回一个Cookies,叫做 cftk。这个感觉是华为云特有的Cookies内容。
(b)继续要求302重定向
6. 根据重定向要求,最终访问网站
上图展示了:最终访问华为云网站,所需要的带的Cookies。
从之前流程可以知道,这部分Cookies是由:多次请求的响应里面的Cookies的集合起来的。
四、使用GO语言模拟整个登陆
将整个流程摸清楚了,就可以写程序来模拟了。首先先发送登陆请求:
接下里,再根据得到的ticket信物,继续访问华为云。根据流程可以知道,Cookies是在继续访问得到的HTTP响应的Header头域里面的,我们只需要记录每一次响应的Header内容就行。
但是注意:
(1)GO语言在发送请求后,如果响应是302重新,那么GO语言是默认会继续访问重定向的地址的。
(2)GO在自动重定向的时候,是不会记录上一次的Cookies的。
然而我们的Cookies有一部分就是在302重定向的响应里面。
思路一:
我一开始的思路就是把302重定向给禁止,记录每一个302响应的结果,然后从结果里面取Cookies的Header。
禁止302重定向方法如下:
GO在http客户端定义的时候,允许介入302的处理。
注意这里的 错误码 http.ErrUseLastResponse ,它代表原封不动的返回302响应给http-client。
然而由于真正访问华为云的过程中有3个重定向,那么代码这样做的缺点就是,重复获取响应的事情得来3遍。有点太麻烦了。
思路二:
幸好,GO语言有一个叫做CookieJar的包,可以专门用来处理Cookies的。它就是一个缓存对象,模拟浏览器行为,记录下来每个网站需要设置的Cookies内容。
用起来也非常简单:
定义一个cookiejar,然后给客户端赋值。一旦设置了这个cookiejar功能后,GO的http客户端,就会自动记录每个网站的Cookies。这样有一个额外的好处就是:就不需要禁止GO语言默认的302行为了。
CookiesJar参考地址:https://zhuanlan.zhihu.com/p/23811184
直接发送请求,然后任由GO自己跟随重定向。拿到结果的时候,Cookies值也拿到了。
这个 cookiesjar的包真是太方便了,大赞。完全不需要自己去一个一个处理响应的Header头域,就把Cookies都拿到了。
而且,后续使用这个 client 发送请求,会自己带上所需要的Cookies,这样一旦登陆成功,直接按照想要的API发送请求就行了。
来源:华为云社区 作者:tsjsdbd