什么是单点登录
单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
单点登录所达到的效果如下图所示,在多应用的情况下,由统一的认证服务负责登录态,用户可以做到一站登录,多应用打通,多个应用之间可能是不同的域名,无法共享cookie。
image.png
要达到单点登录的效果,需要认证机制来支持,一是认证系统要授权应用系统使用自己的登录态,二是要保证整个流程的安全性,这里不得不提到授权协议,单点登录一般借助OAuth的授权流程来保证安全性。
什么是OAUTH2:
OAuth(Open Authorization,开放授权)是一个开放标准的授权协议,允许用户授权第三方应用访问他们存储在资源服务上受保护的信息,而不需要将用户名和密码提供给第三方应用,解耦了认证和授权。OAuth作为一种国际标准,目前传播广泛并被持续采用。OAuth2.0是OAuth协议的延续版本,更加安全,更易于实现。 OAuth 2.0是目前最流行的授权机制,用来授权第三方应用,获取用户数据.
OAuth2四种授权模式
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0 规定了四种获得令牌的流程,可以选择实际情况选择最适合的一种,向第三方应用颁发令牌。
授权码模式(authorization-code):最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
image.png
简化模式(implicit): 有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)"隐藏式"(implicit)。
image.png
密码模式(password): 直接使用Resource owner提供的username和password来直接请求access_token(直接发起Access Token Request然后返回Access Token Response信息)。这种模式一般适用于Resource server高度信任第三方Client的情况下 。我们暂不讨论这种模式。
客户端模式(client credentials):Client直接以自己的名义而不是Resource owner的名义去要求访问Resource server的一些受保护资源。
适用于服务器间通信场景,直接根据client的ID和密钥即可获取token,无需用户参与。这种模式比较合适消费api的后端服务。我们暂不讨论这种模式。
SSO集成oauth2的机制,SSO整体流程一般如下图所示:
image.pngjava生态下主流SSO框架
spring security + oauth2:
1.概念
资源服务器
security:
oauth2:
client:
client-id: demo-client
client-secret: demo-secret
user-authorization-uri: http://localhost:8080/oauth/authorize
access-token-uri: http://localhost:8080/oauth/token
resource:
jwt:
key-uri: http://localhost:8080/oauth/token_key
key-value: demo
authorization:
check-token-access: http://localhost:8080/oauth/check_token
鉴权服务:
网友评论