SSO单点登陆,范例代码部署增益方案
发布于 作者:苏南大叔 来源:程序如此灵动~经过两篇sso
文章的分析,相信大家都会感觉到这个legalthings/sso
官方提供的运行方式的局限性了。为了更好地分析这个sso
的过程。本文中,苏南大叔对这个legalthings/sso
范例,稍稍的进行些改造。以便其更接近于生产模式。改善的地方主要集中在两点:不同的broker
使用不用的域名,并且启动命令的参数传递,也换成其他方式。
本文的范例来自legalthings/sso
。截至到发稿,最新版本为0.3.0 - Bearer auth
。
改造目标
本文范例legalthings/sso
源码来自:
前置阅读文章为:
原版的legalthings/sso
范例运行,需要执行如下四条命令。
php -S localhost:9000 -t examples/server/
export SSO_SERVER=http://localhost:9000 SSO_BROKER_ID=Alice SSO_BROKER_SECRET=8iwzik1bwd; php -S localhost:9001 -t examples/broker/
export SSO_SERVER=http://localhost:9000 SSO_BROKER_ID=Greg SSO_BROKER_SECRET=7pypoox2pc; php -S localhost:9002 -t examples/broker/
export SSO_SERVER=http://localhost:9000 SSO_BROKER_ID=Julias SSO_BROKER_SECRET=ceda63kmhp; php -S localhost:9003 -t examples/ajax-broker/
但是这几个启动命令,和平时大家所熟悉的nginx
+php
的构架是很不搭配的,导致很多新人会望而却步。那么苏南大叔本文中的主要改造之处,就在于使用大家更容易接收的方式实现上述四条命令相同的目的。
网站域名设定
server
域名假设为sso
,三个broker
域名分别设置为a
/b
/c
。四个域名设置在本地的hosts
位置中做了映射。当然,正式的生产环境上,是没有这一步骤的。这里仅仅是个模拟操作而已。
nginx
设置
server {
listen 80;
server_name sso;
root /code/www/php/sso/examples/server;
location / {
index index.html index.php index.htm;
}
access_log /code/www/php/sso/examples/logs/sso.log;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
server {
listen 80;
server_name a;
root /code/www/php/sso/examples/broker;
location / {
index index.html index.php index.htm;
}
access_log /code/www/php/sso/examples/logs/a.log;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
server {
listen 80;
server_name b;
root /code/www/php/sso/examples/broker;
location / {
index index.html index.php index.htm;
}
access_log /code/www/php/sso/examples/logs/b.log;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
server {
listen 80;
server_name c;
root /code/www/php/sso/examples/ajax-broker;
location / {
index index.html index.php index.htm;
}
access_log /code/www/php/sso/examples/logs/c.log;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
这里的设置,就是最普通的nginx
+php
的设置了,唯一特殊的地方,就是增加了个access_log
。主要目的就是便于分析相互之间的数据请求情况。这个nginx
的正常生效,需要新建个对应的logs
目录。
另外,/code/www/php/sso/
字样,是苏南大叔本地的路径,您需要修改为您自己的项目路径。
代码更改
本步骤仅仅是为了替换原版命令中的env
传递命令的方式,而做的修改,并不是唯一答案。下面这篇文章有更详细说明:
增加一个新的配置文件examples/config/broker.php
,注意设置需要和server/myssoserver.php
中的配置保持一致。
<?php
putenv("SSO_SERVER=http://sso");
$domain = $_SERVER['HTTP_HOST'];
switch ($domain) {
case "a":
putenv("SSO_BROKER_ID=Alice");
putenv("SSO_BROKER_SECRET=8iwzik1bwd");
break;
case "b":
putenv("SSO_BROKER_ID=Greg");
putenv("SSO_BROKER_SECRET=7pypoox2pc");
break;
case "c":
default:
putenv("SSO_BROKER_ID=Julias");
putenv("SSO_BROKER_SECRET=ceda63kmhp");
break;
}
?>
然后在下述一系列文件中,增加上述配置文件的调用。比如在autoload.php
后面,增加这个require_once
。
broker/*.php
,ajax-broker/*.php
:
require_once __DIR__ . '/../../vendor/autoload.php';
require_once __DIR__ . '/../config/broker.php';
修改ajax-broker
代码
文件ajax-broker/index.html
,这代码里面有个google cdn
上的jquery
引用,由于未知原因,这个js
文件也是不能访问的。苏南大叔给它换一个新的资源文件。
http://code.jquery.com/jquery-3.3.1.min.js
总结
上述设置之后,从使用方式上来说,就和生产环境基本上没有太大区别了。也不管是什么样的服务器系统也都是能部署和使用的了。大家敬请期待,接下来的苏南大叔提供的sso
原理分析及代码实现。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
Hello, Thank you for nice article!
This is really helpful for me ( I am translating from Chinese to Japanese )
I am developing applications which are PHP app as a main server and Java app as a broker.
Is there any possibility to pass session ID from Java app to PHP app using this lib? Thank you!