文章目录

  • 背景
  • 前提
  • 场景一 单点登录
  • 场景二 门户应用
  • 场景三 类微信登录第三方登录


背景

为了解决企业内部杂乱无章,需求多变的认证问题,各系统相互孤立,用户以及部门等基础数据成为孤立数据。

场景:一个大的企业需要做信息化,慢慢迭代过程中会产生很多的应用系统,由于各种政策和人际关系原因,导致内部系统经常会有多家企业完成,例如:OA系统由A公司完成,车辆GPS跟踪系统由B公司完成,机电管理系统由C系统完成。

问题

  • 系统入口太多,10个系统要记10个网址
  • 用户名/密码体系太多,10个系统10套用户名/密码
  • 多个系统部门等基础数据无法互通
  • 多个系统任务无法互通

前提

所有的解决方案都是以CAS为核心做的一个变种。

设计一个统一认证服务,需要接入的系统,会提前给每个系统分配appId、appsecret,用于后面的接口安全认证。第三方也可以提供一个认证成功后默认的跳转url。

appId

appsecret

url

A_appId

A_appsecret

http://a.com/index

B_appId

B_appsecret

http://b.com/index

设计了以下三种方案,供接入方根据实际情况自行选择。

涉及的角色如下:

  • 认证服务管理员
  • 认证服务
  • 第三方系统

场景一 单点登录

单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

接入步骤如下:

步骤1:

认证服务管理员:根据第三方系统的需求,录入其appId,以及成功重定向的url,例如:http://www.xxx.com/login

步骤2:

第三方系统:在自己内部过滤器或者拦截器的鉴权处,如果鉴权不通过(鉴权自己内部的token、cookie局部会话), 重定向到 http://sso.xx.com/sso/auth?appid=xxx&redirect=http://www.xxx.com(认证服务

步骤3:

用户在输入正确的用户名/密码后认证服务会重定向到之前注册的重定向url并携带ticket,例如:http://www.xxx.com/login?ticket=ceDRSfKeu

ticket

info

ceDRSfKeu

systemA|zhangsan|createtime

第三方系统:拿到 ticket 后,去调用认证服务校验ticket 获取账号id, http://sso.xx.com/sso/checkTicket?ticket=ceDRSfKeu

拿到账户id后,在本系统创建token、cookie等局部会话

注意:ticket是一次性的,且5分钟的有效性。

优点:

比较标准的单点登录方案。

缺点:

这种集成方式,耦合性比较强,会破坏第三方系统的认证架构,强制其走我们的统一认证服务。建议都是公司内部子系统时使用。

场景二 门户应用

用户已经登录进来,点击应用标签调转到相应第三方系统。

参考 单点登录和oauth2.0 改造了一个符合我们业务场景对接方式。

接入步骤如下:

步骤1:

认证服务管理员:根据第三方系统的需求,录入其appId,以及成功重定向的url,例如:http://www.xxx.com/portallogin

步骤2:

门户系统:用户在门户系统登录进来后,例如:点击"机电管理系统",传递机电管理系统的appId,门户系统后台构建重定向url: http://www.xxx.com/portallogin?ticket=ceDRSfKeu,url生成的方式如下:

String redirectUrl = SsoUtil.buildRedirectUrl(userId, redirect);

步骤3:

第三方系统:拿到 ticket 后,去调用认证服务校验ticket 获取账号id, http://sso.xx.com/sso/checkTicket?ticket=ceDRSfKeu

拿到账户id后,在本系统创建token、cookie等局部会话,用户可能要做下映射

注意:ticket是一次性的,且5分钟的有效性。

优点:

接入简单,耦合性不强,对第三方的影响,仅仅是多了个入口.

缺点:

用户、部门等还是独立的需要做映射,建议对接第三方系统时使用。

场景三 类微信登录第三方登录

第三方登录,类似常见的微信登录、QQ登录等。

统一身份认证平台集成架构 统一认证服务简介_后端

在登录页面放一个第三方登录:集团统一登录

步骤1:

认证服务管理员:根据第三方系统的需求,录入其appId,以及成功重定向的url,例如:http://www.xxx.com/login

步骤2:

第三方系统:在 集团统一登录 图片或者按钮的作用是 重定向到 http://sso.xx.com/sso/auth?appid=xxx&redirect=http://www.xxx.com

为了安全,参数redirect也可以不要,用一开始服务端注册的地址。

步骤3:

用户在输入用户名密码后认证服务会重定向到之前注册的重定向url并携带ticket,例如:http://www.xxx.com/login?ticket=ceDRSfKeu

第三方系统:拿到 ticket 后,去调用认证服务校验ticket 获取账号id, http://sso.xx.com/sso/checkTicket?ticket=ceDRSfKeu

拿到账户id后,在本系统创建token、cookie等局部会话,oauth2.0是返回的access_token,后面的所有接口都是用access_token访问。

总结

场景一非常的nice和应用广泛,场景二的解决方案和场景三的解决方案都是从场景一裁剪出来的。