2-跨域SSO

2-跨域SSO_第1张图片
跨域原理图

cookie与session

cookie属于(域 + 路径),不区分用户,而session针对用用户会话。
例如,用户A登录http://www.a.com/demo1,设置cookie[a] = 123,session[b] = 456,当用户A在该浏览器上退出,用户B在该浏览器上登录http://www.a.com,此时用户B可以查看cookie[a] = 123, 而session[b]是没有数据的。因为cookie[a]属于域www.a.com(当设置路径为根路径时)

假设有两个跨域应用:
http://www.a.com
http://www.b.com
单点登录系统:
http://www.x.com

  1. 用户访问http://www.a.com, ServerA从cookie(www.a.com域下根路径)中查询token,如果不存在,执行逻辑2,否则执行逻辑3;
  2. 返回http://www.a.com的登录界面给浏览器,用户输入username+password向ServerA发起登录请求,执行逻辑5;
  3. ServerA访问ServerSSO的验证接口,ServerSSO验证token是否在记录列表中,返回验证验证结果。ServerA判断验证结果,如果token有效,执行逻辑4,否则执行逻辑2;
  4. 返回http://www.a.com的主页给浏览器(附带token),主页中通过iframe的形式,分别访问ServerA与ServerB的addCookie接口(附带token),ServerA将token设置到cookie(www.a.com域下根路径)中,浏览器与ServerB通讯,ServerB将token设置到cookie(www.b.com域下根路径)中,当访问http://www.b.com时,执行逻辑3(针对ServerB)
  5. ServerA访问ServerSSO的登录接口,ServerSSO验证username+password是否有效,若有效则生成并记录token,将token返回给ServerA,否则返回认证失败信息。ServerA判断认证结果,如果认证成功,执行逻辑4,否则执行逻辑逻辑2

iframe设置token

index.html中通过iframe的方式,分别访问http://www.a.com/addCookie和http://www.b.com/addCookie,将token设置到服务器A和B的cookie中

对于ServerB,因为浏览器中index.html通过iframe的方式访问了ServerB,对于ServerB就添加了token的cookie

当在浏览器中键入http://www.b.com时,ServerB的cookie(www.b.com域下的)中存在token,且该token在ServerSSO中验证合法,从而可以访问到ServerB的index.jsp,不需要再去登录(不会跳转到ServerB的登录页面)。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


    Title


demo1.jsp
${cookie.token.value}

    



架构特点

  1. ServerA与ServerB有各自的前端登录页面,但是后端认证都是请求ServerSSO
  2. ServerSSO中token只能自己管理,不能放到cookie中存储,因为ServerA与ServerB都是通过http请求访问ServerSSO,不会携带之前的cookie
  3. ServerA与ServerB中token是在cookie中管理,直接跟浏览器打交道(浏览器每次请求都会携带对应域名下的cookie)

你可能感兴趣的:(2-跨域SSO)