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

举报
tsjsdbd 发表于 2018/05/25 15:53:44 2018/05/25
【摘要】 详解描述使用账号登陆华为云流程,并给出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发送请求就行了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200