五环小胖子的博客

SSO设计与实现

2016-04-02
Ryan
php
   

SSO概要

SSO英文全称Single Sign On,即单点登录。在多个用户系统中,用户只需要登录在某个系统上登录一次,那么就可以在所有相互信任的系统上登录。在企业级的应用中,减少了用户的登陆成本,提高了系统的易用性和可用性。

SSO的构成

1、客户端

这里的客户端是接入SSO的系统,我们称之为子系统。

2、认证中心

认证中心的主要工作就是,向子系统提供有效的登录凭证、校验子系统的登陆凭证和协助子系统302重定向。

3、LDAP

LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。

本片文章主要介绍SSO的实现,对LDAP不做过多的说明。

具体的解释看这里

4、Session Pool

Session池,用来存储用户的登录信息。用redis或者memcache实现。k-v存储的结构,我们可以将key做Session Key,value则存储用户的一些基础信息,比如:用户名等。

SSO实现图解

流程图

SSO流程图

时序图

SSO时序图

SSO接入描述

1、子系统配置

子系统需要配置app id和app key,app id和app key需要向SSO认证中心申请。

2、SSO登录校验

为需要登录的页面设置SSO登录校验,登录校验需判断当前子系统有无SSO认证中心下发的ticket,如果有则走API校验ticket的有效性,校验成功进入访问的页面,校验失败则302重定向至SSO登录地址。

如果子系统未发现ticket,则直接302重定向至SSO登录地址(跳转至SSO登录地址需携带参数app_id和jumpto,jumpto一般为子系统要访问的页面地址)。

3、SSO回调

SSO的回调地址,是子系统向认证中心申请的,SSO会根据此地址跳转回相应子系统。

SSO重定向至子系统时,会携带jumpto和code两个参数,jumpto是由子系统带给SSO的地址,code是由SSO生成用于换取ticket的凭证。

子系统的回调地址接收code以后需API请求校验code,校验成功SSO会json返回给子系统ticket和username(登陆用户名)。

子系统拿到ticket和username后自行存储(推荐存储为浏览器cookie),然后子系统根据jumpto跳转至需要访问的页面。

注意:如果子系统没带jumpto给sso,那么sso会默认带上名为index的参数(即jumpto=index),子系统需要根据这个index跳转到自己相应的主页地址。

4、统一退出

子系统退出时,请清除掉已存储的ticket和username,然后携带app id重定向至SSO统一退出地址。

SSO实现源码

github地址

SSO相关接口说明

看这里看这里


Similar Posts