SSO单点登录,attach操作代码逻辑实现及鉴权操作
发布于 作者:苏南大叔 来源:程序如此灵动~
本文以legalthings/sso的增益改善版本为基础,分析的手段则是基于f12抓包以及nginx的日志文件。主要分析点是身份鉴权过程。本文的前置阅读文章是:

本文测试环境: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 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。

第二个broker的attach
浏览器登陆第二个broker的时候,上面的流程是再次走一次的。但是,再attach的时候,attach的url中包含的信息是broker2中的sso_token_{broker}和secret。但是对于sso server来说,cookie却还是第一次broker的PHPSESSID。那么就是通过这种方式,将两个broker的用户登陆联系起来的。
关于如何进行关联这部分内容,待下文分解。
总结
本文从代码算法层面,对sso server的attach操作进行了分析。更多sso的代码分析,且听苏南大叔的下回分解。