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

来自tomtalk
跳转至: 导航搜索
单点登录
 
Tom讨论 | 贡献
CAS
 
(未显示同一用户的31个中间版本)
第1行: 第1行:
 +
=相关收藏=
 +
 +
* [http://www.coin163.com/java/docs/201309/d_2830028902.html SSO实现机制:Cookie机制和Session机制]
 +
 +
=Laravel oauth2=
 +
 +
==配置Laravel oauth2服务器==
 +
 +
https://github.com/lucadegasperi/oauth2-server-laravel 按文档给lumen添加oauth2很顺利,没有意外发生。
 +
 +
1、获取oauth2组件
 +
<source lang='bash'>
 +
#composer.json
 +
"lucadegasperi/oauth2-server-laravel": "5.1.*"
 +
 +
composer update
 +
</source>
 +
 +
2、配置oauth2
 +
<source lang='php'>
 +
//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,
 +
</source>
 +
 +
3、配置数据库
 +
<source lang='bash'>
 +
php artisan vendor:publish
 +
php artisan migrate
 +
</source>
 +
 +
==配置Laravel oauth2客户端==
 +
 +
相对服务端的配置,客户端的配置真是太简单了,只要一条composer命令即可。
 +
 +
<source lang='bash'>
 +
$ composer require league/oauth2-client
 +
</source>
 +
 +
=Laravel单点登入原型=
 +
 +
==站点结构==
 +
 +
* laravel.example.com 认证服务器。
 +
* thinkphp.example.com 采用session共享方式实现单点登录。
 +
* thinkphp.greatwall.com 采用session共享且跨域,实现单点登录。
 +
* [a|b|c|d].example.com 客户端。
 +
 +
==Laravel与ThinkPHP共享SESSION实现单点登录==
 +
 +
# 把Laravel的session存入数据库
 +
# 把ThinkPHP的session存入数据库
 +
# 修改ThinkPHP的session.save_hander为自定义数据库,修改session读写驱动按Laravel格式读取、存储SESSION数据。
 +
# 设置Laravel、ThinkPHP使用相同的session.name、session.cookie_domain。
 +
# 结束
 +
 +
==跨域共享session==
 +
 +
这里的关键是,如何跨域指定cookie里的session_id。试了几个方法,做不到。stackoverflow上也说,不可以。
 +
 +
想了想,不同的域名,还是要用redirect的方法来认证,设置本地cookie的session_id。我的做法是这样的:
 +
 +
# 用户打开客户端,如果有session_id则能共享数据。
 +
# 如果客户端没有登入,则跳转至认证服务器。如果事先已有登录,则直接redirect跳转回客户端,带上session_id。如果没登录,登录后再跳转。
 +
# 客户端收到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=
 
=CAS=
  
第23行: 第124行:
 
OAuth 2.0定义了四种授权方式。
 
OAuth 2.0定义了四种授权方式。
  
#授权码模式(authorization code):复杂,token由授权服务器直接发给客户端。
+
#授权码模式(authorization code):功能最完整、流程最严密的授权模式。token由授权服务器直接发给客户端。
 
#简化模式(implicit):复杂,token在浏览器上算出。
 
#简化模式(implicit):复杂,token在浏览器上算出。
 
#密码模式(resource owner password credentials):简单,客户端不得存储用户的密码。
 
#密码模式(resource owner password credentials):简单,客户端不得存储用户的密码。
 
#客户端模式(client credentials):对客户端的授权,也就是无授权。
 
#客户端模式(client credentials):对客户端的授权,也就是无授权。
  
https://github.com/lucadegasperi/oauth2-server-laravel 按文档给lumen添加oauth2很顺利,没有意外发生。
+
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 阮一峰对oauth2的介绍
  
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=
 
=JSONP=

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