单点登录
目录
相关收藏
Laravel单点登入原型
站点结构
- laravel.example.com 认证服务器。
- thinkphp.example.com 采用session共享方式实现单点登录。
- thinkphp.greatwall.com 采用session共享且跨域,实现单点登录。
- [a|b|c|d].example.com 客户端。
配置Laravel oauth2服务器
https://github.com/lucadegasperi/oauth2-server-laravel 按文档给lumen添加oauth2很顺利,没有意外发生。
1、获取oauth2组件
#composer.json "lucadegasperi/oauth2-server-laravel": "5.1.*" composer update
2、配置oauth2
//config/app.php LucaDegasperi\OAuth2Server\Storage\FluentStorageServiceProvider::class, LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider::class, //Add this line to the aliases array: 'Authorizer' => LucaDegasperi\OAuth2Server\Facades\Authorizer::class, //app/Http/Kernel.php file in the $middleware array \LucaDegasperi\OAuth2Server\Middleware\OAuthExceptionHandlerMiddleware::class, //Then add below to the $routeMiddleware array. 'oauth' => \LucaDegasperi\OAuth2Server\Middleware\OAuthMiddleware::class, 'oauth-user' => \LucaDegasperi\OAuth2Server\Middleware\OAuthUserOwnerMiddleware::class, 'oauth-client' => \LucaDegasperi\OAuth2Server\Middleware\OAuthClientOwnerMiddleware::class, 'check-authorization-params' => \LucaDegasperi\OAuth2Server\Middleware\CheckAuthCodeRequestMiddleware::class, //XX: In order to make some the authorization and resource server work correctly with Laravel5, remove the App\Http\Middleware\VerifyCsrfToken line from the $middleware array and place it in the $routeMiddleware array like this: 'csrf' => App\Http\Middleware\VerifyCsrfToken::class,
3、配置数据库
php artisan vendor:publish php artisan migrate
配置Laravel oauth2客户端
相对服务端的配置,客户端的配置真是太简单了,只要一条composer命令即可。
$ composer require league/oauth2-client
Laravel与ThinkPHP共享SESSION实现单点登录
- 把Laravel的session存入数据库
- 把ThinkPHP的session存入数据库
- 修改ThinkPHP的session.save_hander为自定义数据库,修改session读写驱动按Laravel格式读取、存储SESSION数据。
- 设置Laravel、ThinkPHP使用相同的session.name、session.cookie_domain。
- 结束
跨域共享session
跨域指定cookie,试了几个方法,做不到。stackoverflow上说,不可以。
想了想,不同的域名,还是要用redirect的方法来认证,设置本地cookie的session_id。
我的做法是这样的:
- 用户打开客户端,如果有session_id则能共享数据。
- 如果客户端没有登入,则跳转至认证服务器。如果事先已有登录,则直接redirect跳转回客户端,带上session_id。如果没登录,登录后再跳转。
- 客户端收到session_id,写入cookie,就可以共享数据了。
- 但是子项目是没有连接数据库的,加入认证服务器有用户数据,且登录了,在客户端看怎么同步?
客户端与认证服务器共享数据库,就能共享session。
客户端与认证服务器不共享数据库,就只能用oauth来认证登录,session就没法共享了。这样的话,用户操作就要频率取得认证了。
我的想法是:把session存到redis里,独立出来,这样就不会受数据库的影响了。
CAS
https://www.apereo.org/projects/cas CAS官网
http://blog.chinaunix.net/uid-22816738-id-3525939.html CAS+SSO原理浅谈
http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html 使用 CAS 在 Tomcat 中实现单点登录
http://www.cnblogs.com/zhenyulu/archive/2013/01/22/2870838.html Yale CAS + .net Client 实现 SSO
http://hybridauth.sourceforge.net HybridAuth
OAuth 2.0
传统密码授权的缺陷:
- "云冲印"为了后续的服务,会保存用户的密码,这样很不安全。
- Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。
- "云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。
- 用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
- 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。
OAuth 2.0定义了四种授权方式。
- 授权码模式(authorization code):复杂,token由授权服务器直接发给客户端。
- 简化模式(implicit):复杂,token在浏览器上算出。
- 密码模式(resource owner password credentials):简单,客户端不得存储用户的密码。
- 客户端模式(client credentials):对客户端的授权,也就是无授权。
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 阮一峰对oauth2的介绍。
JSONP
http://www.cnblogs.com/qiongmiaoer/archive/2013/03/17/2964822.html
https://www.wuchengkai.com/principle/
http://www.travisup.com/post/index/28
JWT
http://blog.leapoahead.com/2015/09/06/understanding-jwt/ JSON Web Token - 在Web应用间安全地传递信息