• 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

  • 相关阅读:
    微信小程序 API 界面 (2)
    微信小程序 API 界面(1)
    微信小程序 API 路由
    微信小程序 API 基础
    微信小程序image组件
    navigator组件(相当于a标签)
    functional-page-navigator 组件
    node.js配置环境变量
    animate(动画)框架 和 swiper (轮播)框架 的使用
    SwipeRefreshLayout的使用,下拉刷新
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165831.html
Copyright © 2020-2023  润新知