天天看点

跨域 SSO 单点登录第一次请求ClientA第二次请求ClientA第一次请求ClientB参考文章

目录

  • 第一次请求ClientA
      • 时序图语句
  • 第二次请求ClientA
      • 时序图语句
  • 第一次请求ClientB
      • 时序图语句
  • 参考文章

这些跨域域名往往都是一个公司的。可以通过内部的反向代理(比如nginx)将任何域名下的路径自由路由到任何的服务端。

只要业务域名下预留一个/passport 路径用来转发给ServerSSO就行了。或者也可以不用预留,采用在sso系统配置的形式也可以。该path用来拿着ticket换取sessionKey。

因此如果有两个应用都使用了sso。比如a.com 和b.com 都可以配置path:

location ~ ^/passport/ {

proxy_pass http://sso_backend;

}

将/passport 请求直接转发到sso server

图中的service表示表示业务方所需要的回调地址。

时序图绘画工具可以采用以下两个工具,语法差不多

https://www.websequencediagrams.com/

http://webchart.ihuhai.cn/index.html

第一次请求ClientA

跨域 SSO 单点登录第一次请求ClientA第二次请求ClientA第一次请求ClientB参考文章

时序图语句

Note left of User: 第一次请求ClientA
User->ClientA: 1,get a.com
ClientA->ServerA: 2,询问是否有登录态
ServerA->ServerA: 3,检查a.com的cookie
ServerA-->ClientA: 4,没有登录态, 跳转 302 Location=\nsso.com/check_login?service=a.com
ClientA->ServerSSO:5, sso.com/check_login?service=a.com
ServerSSO-->ClientA:6, 没有登录态
ClientA->ClientSSO: 7, 登录页面sso.com/service=a.com\n GET挂起 web/模态框
ClientSSO->ClientSSO:8, 各种验证\n 短信/验证码
ClientSSO->ServerSSO:9, sso.com/quick_login?app_id=1&\nservice=a.com&moblie=xx&code=xx\n 电话/验证码
Note right of ServerSSO: 登录成功,在sso域下种下cookie。\n并生成ticket
ServerSSO-->ClientSSO: 10, 登录成功
ClientSSO-->ClientA:11, 302 Location=a.com/passport/?next=a.com&ticket=abc
ClientA->Nginx:12, a.com/passport/?next=a.com&ticket=abc
Nginx->ServerSSO:13, 代理转发
Note right of ServerSSO: 验证ticket成功,获取到用户信息,在 a 域下种下cookie
ServerSSO-->Nginx:14, 302 Location=a.com
Nginx-->ClientA:15, 302 Location=a.com
ClientA->ServerA:16, get a.com
ServerA->ServerA:17, 检查a.com的cookie,有登录态
ServerA-->ClientA:18, 返回页面内容
ClientA-->User:19, 返回内容
           

3 中根据场景不同,这里a应用可以自己保存自己的session,或者直接拿sso 给的sessionId去ServerSSO获取session。

3 中 service 参数是原用户访问的地址,是希望在登录完成以后跳回来的地址

6 中ServerSSO需要根据SSO域下的cookie校验用户的登录态

10 中 sso域种下的cookie一般叫做 sessionKey,sessionId之类的

11 中next参数就是之前的service参数

13 中浏览器访问的是 a.com/passport/ 这个域下的 /passport/ 路径被配置为转发到ServerSSO,而不是 ServerA,之后ServerSSO响应的时候带上了 Set-COOKIE,种下sessionKey或者sessionId。这是在客户域下种cookie的关键。

第二次请求ClientA

跨域 SSO 单点登录第一次请求ClientA第二次请求ClientA第一次请求ClientB参考文章

时序图语句

Note left of User: 第二次请求ClientA
User->ClientA: get a.com/page2
ClientA->ServerA: get a.com/page2
ServerA->ServerA: 检查a.com的cookie,有登录态
ServerA-->ClientA: 返回页面内容
ClientA-->User: 返回内容

           

第一次请求ClientB

跨域 SSO 单点登录第一次请求ClientA第二次请求ClientA第一次请求ClientB参考文章

时序图语句

Note left of User: 第一次请求ClientB
User->ClientB: 1,et b.com
ClientB->ServerB: 2,get b.com
ServerB->ServerB: 3,检查b.com的cookie
ServerB-->ClientB: 4,没有登录态, 跳转 302 Location=\nsso.com/check_login?service=b.com
ClientB->ServerSSO:5, sso.com/check_login?service=b.com
ServerSSO-->ClientB:6,已登录 302 Location=\nb.com/passport/?next=b.com&ticket=efg
ClientB->Nginx:7, b.com/passport/?next=b.com&ticket=efg
Nginx->ServerSSO:8,代理转发
Note right of ServerSSO: 验证ticket成功,获取到用户信息,在 b 域下种下cookie
ServerSSO-->Nginx:9, 302 Location=b.com
Nginx-->ClientB:10, 302 Location=b.com
ClientB->ServerB: 11,get b.com
ServerB->ServerB: 12,检查b.com的cookie,有登录态
ServerB-->ClientB: 13,返回页面内容
ClientB-->User: 14,返回内容B
           

参考文章

漫谈单点登录(SSO)

SSO 单点登录

单点登录(SSO)看这一篇就够了

继续阅读