我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文以legalthings/sso的增益改善版本为基础,分析的手段则是基于f12抓包以及nginx的日志文件。主要分析点是身份鉴权过程。本文的前置阅读文章是:

苏南大叔:SSO单点登录,attach操作代码逻辑实现及鉴权操作 - sso-code-hero
SSO单点登录,attach操作代码逻辑实现及鉴权操作(图3-1)

本文测试环境:mac/legalthings/sso@0.3.0 - Bearer auth

broker处理attach

下面的是几点整体总结:

  • 用户浏览器实质上参与了attach操作,但是对于用户来说,却是无感的。
  • attach操作是由broker导向的,对于同一用户来说,仅仅attach一次。是否需要用户浏览器参与attach操作,判断标准就是一个名为sso_token_{broker}cookie
  • 用户浏览器参与attach操作之后,会和broker之间有个cookie,名为:sso_token_{broker}。对于浏览器来说,叫做cookie,而对于broker来说,就叫做token。两个名字实际上是同一个事物。
  • 用户浏览器和sso server之间也有个cookie,名为PHPSESSID。但是对于当前broker来说,可能用到的概率就不大了。但是对于第二个broker来说,新的attach操作,就是靠这个cookie,来把本次的broker和上一次的broker进行关联的。

下面描述实现代码细节:
src/Broker.php:

public function __construct($url, $broker, $secret, $cookie_lifetime = 3600){
    //...
    if (isset($_COOKIE[$this->getCookieName()])) $this->token = $_COOKIE[$this->getCookieName()];
}
protected function getCookieName(){
    return 'sso_token_' . preg_replace('/[_\W]+/', '_', strtolower($this->broker));
}
public function generateToken(){
    if (isset($this->token)) return;
    $this->token = base_convert(md5(uniqid(rand(), true)), 16, 36);
    setcookie($this->getCookieName(), $this->token, time() + $this->cookie_lifetime, '/');
}
public function isAttached(){
    return isset($this->token);
}
public function attach($returnUrl = null){
    if ($this->isAttached()) return;
    //...
}

苏南大叔:SSO单点登录,attach操作代码逻辑实现及鉴权操作 - serverside-setcookie
SSO单点登录,attach操作代码逻辑实现及鉴权操作(图3-2)

把浏览器导向到sso server处理attach

在浏览器参与的attach过程中,有个307跳转的概念,这个概念的说明文章如下:

public function attach($returnUrl = null){
    //...
    $params = ['return_url' => $returnUrl];
    $url = $this->getAttachUrl($params);
    header("Location: $url", true, 307);
    //...
}
public function generateToken(){
    if (isset($this->token)) return;
    $this->token = base_convert(md5(uniqid(rand(), true)), 16, 36);
    setcookie($this->getCookieName(), $this->token, time() + $this->cookie_lifetime, '/');
}
public function getAttachUrl($params = []){
    $this->generateToken();
    $data = [
        'command' => 'attach',
        'broker' => $this->broker,
        'token' => $this->token,
        'checksum' => hash('sha256', 'attach' . $this->token . $this->secret)
    ] + $_GET;
    return $this->url . "?" . http_build_query($data + $params);
}

在上面的代码中,出现了三个算法,

  • 一个是sso_token_{broker}的算法,就是个随机值,cookie有效期为默认的3600秒。
  • 另外一个是checksum算法,由token(也就是sso_token_{broker}secret两个值加密而成。
  • broker强制浏览器通过307跳转给seo server的数据。主体组成是:command/broker/token/checksum

苏南大叔:SSO单点登录,attach操作代码逻辑实现及鉴权操作 - attach-code
SSO单点登录,attach操作代码逻辑实现及鉴权操作(图3-3)

第二个brokerattach

浏览器登陆第二个broker的时候,上面的流程是再次走一次的。但是,再attach的时候,attachurl中包含的信息是broker2中的sso_token_{broker}secret。但是对于sso server来说,cookie却还是第一次brokerPHPSESSID。那么就是通过这种方式,将两个broker的用户登陆联系起来的。

关于如何进行关联这部分内容,待下文分解。

总结

本文从代码算法层面,对sso serverattach操作进行了分析。更多sso的代码分析,且听苏南大叔的下回分解。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   sso