“单点登录”的版本间的差异

来自tomtalk
跳转至: 导航搜索
OAuth 2.0
Tom讨论 | 贡献
CAS
 
第89行: 第89行:
  
 
我的想法是:把session存到redis里,独立出来,这样就不会受数据库的影响了。
 
我的想法是:把session存到redis里,独立出来,这样就不会受数据库的影响了。
 +
 +
=同域名共享cookie=
 +
 +
如果你的所有平台都是在同一个域名下,那么可以使用同域名共享cookie的方式来完成单点登录的信息共享。
 +
 +
将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。
 +
 +
然而,可行并不代表好,共享 cookie 的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。
 +
 +
因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录。
  
 
=CAS=
 
=CAS=

2017年10月10日 (二) 08:22的最后版本

相关收藏

Laravel oauth2

配置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单点登入原型

站点结构

  • laravel.example.com 认证服务器。
  • thinkphp.example.com 采用session共享方式实现单点登录。
  • thinkphp.greatwall.com 采用session共享且跨域,实现单点登录。
  • [a|b|c|d].example.com 客户端。

Laravel与ThinkPHP共享SESSION实现单点登录

  1. 把Laravel的session存入数据库
  2. 把ThinkPHP的session存入数据库
  3. 修改ThinkPHP的session.save_hander为自定义数据库,修改session读写驱动按Laravel格式读取、存储SESSION数据。
  4. 设置Laravel、ThinkPHP使用相同的session.name、session.cookie_domain。
  5. 结束

跨域共享session

这里的关键是,如何跨域指定cookie里的session_id。试了几个方法,做不到。stackoverflow上也说,不可以。

想了想,不同的域名,还是要用redirect的方法来认证,设置本地cookie的session_id。我的做法是这样的:

  1. 用户打开客户端,如果有session_id则能共享数据。
  2. 如果客户端没有登入,则跳转至认证服务器。如果事先已有登录,则直接redirect跳转回客户端,带上session_id。如果没登录,登录后再跳转。
  3. 客户端收到session_id,写入cookie,就可以共享数据了。


但是子项目是没有连接数据库的,加入认证服务器有用户数据,且登录了,在客户端看怎么同步?

客户端与认证服务器共享数据库,就能共享session。

客户端与认证服务器不共享数据库,就只能用oauth来认证登录,session就没法共享了。这样的话,用户操作就要频率取得认证了。

我的想法是:把session存到redis里,独立出来,这样就不会受数据库的影响了。

同域名共享cookie

如果你的所有平台都是在同一个域名下,那么可以使用同域名共享cookie的方式来完成单点登录的信息共享。

将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。

然而,可行并不代表好,共享 cookie 的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。

因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录。

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

传统密码授权的缺陷:

  1. "云冲印"为了后续的服务,会保存用户的密码,这样很不安全。
  2. Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。
  3. "云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。
  4. 用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
  5. 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。

OAuth 2.0定义了四种授权方式。

  1. 授权码模式(authorization code):功能最完整、流程最严密的授权模式。token由授权服务器直接发给客户端。
  2. 简化模式(implicit):复杂,token在浏览器上算出。
  3. 密码模式(resource owner password credentials):简单,客户端不得存储用户的密码。
  4. 客户端模式(client credentials):对客户端的授权,也就是无授权。

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 阮一峰对oauth2的介绍

http://www.cnblogs.com/highend/archive/2012/07/05/oauth2_introduced.html OAuth 2.0 - 基本介绍

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应用间安全地传递信息