GO语言实现 自动登陆华为云并获取cookies 详解(兼介绍SSO单点登陆)

【摘要】 详解描述使用账号登陆华为云流程,并给出GO语言代码实现,来获取登陆后返回的Cookies。这样后续请求华为云接口,就可以做到直接访问。同时讲解了SSO单点登陆流程,辅助理解SSO原理。

一、背景

    测试需要(或者爬虫抓取),在往需要登陆的网页发送请求时,是需要携带Cookies的,否则会被禁止访问。然而Cookies字段则是在使用用户名+密码登陆后才能获取到的。

    本文介绍如何使用Go语言实现登陆,并将Cookies保存下来,并在后续请求中继续使用的详细实现。

二、判断交互流程

    查找资料,发现SSO单点登陆流程大概长这样:

  1. 首次访问

sso-1.PNG

2. 重定向到SSO服务器

sso-2.PNG

3. 再次访问

sso-3.PNG

更学术一点,具体协议上的交互如下:

(客户端)                                  (SSO服务器)                                   (目标网站)

换sessionID.PNG

资料来源:https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol.html

三、验证交互流程

    直接打开Chrome,使用F12调试模式,将整个登陆流程记录下来。

  1. 发送登陆请求:

登陆.PNG

包含两个东西: (a)SSO服务器。  (b)登陆成功后,继续访问的网址。

2. 发送登陆请求,所带的账号信息:

账号.PNG

3. SSO服务器返回结果:

ticket地址.PNG

这个是用Postman发送登陆请求后获得的响应Body体。 

顺便提一下这里两个疑问:

(a)CAS协议里面,登陆成功后回到原来网站,是用重定向302响应。而华为的SSO却是在响应Body里的。

(b)Chrome记录里面,没有记录下这个响应。只能在Postman里面才看到响应Body。(甚是奇怪,浪费我很久)

4. 继续访问原来网站。

访问ticket.PNG

注意,这里就带上登陆后给的“信物”了,?ticket=xxxx 。

响应里面带了两个东西:

(a) 告诉你后续访问带的Cookies,比如SessionID,agencyID。

(b)继续用不带信物,但是带上Cookies再次访问一次。

5. 根据重定向再次访问网站

首页.PNG

(a)这里又返回一个Cookies,叫做 cftk。这个感觉是华为云特有的Cookies内容。

(b)继续要求302重定向

6. 根据重定向要求,最终访问网站

最终结果.PNG

上图展示了:最终访问华为云网站,所需要的带的Cookies。 

从之前流程可以知道,这部分Cookies是由:多次请求的响应里面的Cookies的集合起来的。

四、使用GO语言模拟整个登陆

将整个流程摸清楚了,就可以写程序来模拟了。首先先发送登陆请求:

go-登陆.PNG

接下里,再根据得到的ticket信物,继续访问华为云。根据流程可以知道,Cookies是在继续访问得到的HTTP响应的Header头域里面的,我们只需要记录每一次响应的Header内容就行。

但是注意:

(1)GO语言在发送请求后,如果响应是302重新,那么GO语言是默认会继续访问重定向的地址的。

(2)GO在自动重定向的时候,是不会记录上一次的Cookies的。

然而我们的Cookies有一部分就是在302重定向的响应里面。

思路一:

我一开始的思路就是把302重定向给禁止,记录每一个302响应的结果,然后从结果里面取Cookies的Header。

禁止302重定向方法如下:

go-302-2.PNG

GO在http客户端定义的时候,允许介入302的处理。

注意这里的 错误码 http.ErrUseLastResponse ,它代表原封不动的返回302响应给http-client。

go-302.PNG

然而由于真正访问华为云的过程中有3个重定向,那么代码这样做的缺点就是,重复获取响应的事情得来3遍。有点太麻烦了。

思路二:

幸好,GO语言有一个叫做CookieJar的包,可以专门用来处理Cookies的。它就是一个缓存对象,模拟浏览器行为,记录下来每个网站需要设置的Cookies内容。

用起来也非常简单:

cookiejar.PNG

定义一个cookiejar,然后给客户端赋值。一旦设置了这个cookiejar功能后,GO的http客户端,就会自动记录每个网站的Cookies。这样有一个额外的好处就是:就不需要禁止GO语言默认的302行为了。

CookiesJar参考地址:https://zhuanlan.zhihu.com/p/23811184

直接发送请求,然后任由GO自己跟随重定向。拿到结果的时候,Cookies值也拿到了。

cookies.PNG

这个 cookiesjar的包真是太方便了,大赞。完全不需要自己去一个一个处理响应的Header头域,就把Cookies都拿到了。

而且,后续使用这个 client 发送请求,会自己带上所需要的Cookies,这样一旦登陆成功,直接按照想要的API发送请求就行了。

来源:华为云社区  作者:tsjsdbd

发布了877 篇原创文章 · 获赞 5228 · 访问量 66万+
展开阅读全文

没有更多推荐了,返回首页

分享到微信朋友圈

×

扫一扫,手机浏览