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
的代码分析,且听苏南大叔的下回分解。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。