[TOC]
## 一、原理说明
### 1.1. 基本原理

SSO单点登录是基于共享`auth-server授权中心`的`cookie`来实现的,大概流程如下:
1. 当**系统1**登录成功后
2. **auth-server授权中心**里面会保存了**系统1**中的登录信息建立全局会话,并把自己的cookie写到用户的浏览器中
3. 当同一个浏览器访问**系统2**时,当跳转到**auth-server授权中心**授权时会把浏览器中`auth-server`的`cookie`也带过去
4. **auth-server授权中心**根据自己的`cookie`判断该浏览器的用户已经登录过,则自动登录完成**单点登录**
### 1.2. 架构图

>[info] webApp应用可以使用其他oauth2模式登录不一定必需`password模式`,但是如果多个系统之间不同域(跨域)则必需使用`授权码`或者`简单`模式
### 1.3. 单点时序图

### 1.4. 单点登录的请求步骤
下图是访问`sso-demo`的地址[http://127.0.0.1:8001](http://127.0.0.1:8001/)时`@EnableOAuth2Sso`注解与`auth-server授权中心`通过`Oauth2授权码模式`交互完成单点登录的步骤

> 结合上面`单点时序图`中**访问系统2**的1~5步
### 1.5. 基于`Spring Security`实现

最简单的方式就是使用`Spring Security`的`@EnableOAuth2Sso注解`,该注解会自动添加一个认证过滤器,自动完成`授权码模式`的oauth2授权流程
> 如果不是使用`Spring Security`框架或者不想用`授权码模式`怎么办?按照原理自己实现即可

> **security.oauth2.sso.login-path**:设置回调地址(默认是/login)
## 二、注意事项
### 2.1. 授权类型

应用的授权类型需要支持`授权码模式`参考上图#2位置,应用的`authorized_grant_types`字段需要支持授权码模式
### 2.2. 回调地址

回调地址必需与应用配置的地址一致,参考上图的#3位置,可以通过`security.oauth2.sso.login-path`配置指定回调地址,否则会出现一下错误

### 2.3. 单点的系统间访问auth-server的域名必需一致
由于原理是共享`auth-server授权中心`的`cookie`,首先需要使用同一个浏览器访问,并且不同系统跳转auth-server时所使用的域名必需一致才能`共享cookie`
>[danger] 一个用域名访问auth-server另一个用ip访问auth-server不行
>[danger] 一个用`localhost`访问auth-server另一个用`127.0.0.1`访问auth-server也不行
- 微服务介绍
- 软件架构设计
- 系统简介
- 运行环境
- 模块介绍
- 启动部署命令参数
- 打包说明
- 开发说明
- Java8
- 认证理论
- 有网络隔离
- 无网络隔离
- token自动续签设计
- url级权限控制
- 单点登录
- 登录
- 用户名密码(+验证码)登录
- 通过openId获取token
- 通过手机号获取token
- 第三方系统接口对接
- 第三方系统单点登录
- 通用刷新token
- 账号登出接口
- 统一异常处理
- 日志埋点工具
- 审计日志
- yml自定义配置自动提示
- Redis使用
- CacheManager集成
- 搜索中心
- 网关zuul动态路由
- swagger
- 解决开发环境的服务冲突和实例乱窜
- 多租户理论
- 多租户实现
- 分布式锁
- 分布式id生成器
- 分布式事务
- 分库分表sharding-sphere
- 消息队列
- 系统幂等性
- X 实时搜索系统设计
- Spring Cloud性能调优
- 链路跟踪
- JWT的RSA非对称密钥生成
- jdk
- Oracle
- OpenJDK
- Dragonwell
- JVM介绍
- 常见JVM内存错误及解决方案
- JVM分析工具详解
- nexus
- docker
- 安装
- docker-compose安装
- 私有仓库搭建
- 指定数据储存目录
- 添加私有仓库
- 提交拉取镜像
- X 免Dockerfile文件构建项目镜像
- 持续集成部署CI/CD
- Confluence知识管理
- JIRA事务与项目跟踪软件
- Gitlab代码仓库
- Jenkins自动化部署
- SonarQube代码检测
- Rancher容器管理平台
- nacos
- 部署
- Rancher部署nacos
- 注册中心
- 配置中心
- 多环境
- 生产部署方案
- X 通过Nginx来实现环境隔离
- Sentinel详解
- 动态规则扩展
- 在生产环境中使用 Sentinel
- 启动配置项
- X 网关流控
- ELK日志系统和慢查询SQL
- docker安装
- 普通安装
- Filebeat安装部署
- ES数据定期删除
- 没数据问题排查思路
- X Logstash的grok语法调试
- 慢查询sql
- 审计日志
- Elasticsearch性能优化
- APM监控
- SkyWalking介绍
- Zipkin,Pinpoint,SkyWalking三种服务链路监控组件分析
- 服务端部署
- 客户端部署
- 日志清理
- Metrics监控
- 二进制包部署
- docker部署
- docker安装各组件监控
- Grafana仪表盘和告警配置
- JMeter压力测试工具
- 使用说明
- 分布式事务
- TX-LCN(同步)
- X SEATA(同步)
- X RocketMQ(异步)
- 消息队列
- RocketMQ
- RocketMQ安装部署
- RocketMQ常见异常处理
- SpringCloud-Stream
- RabbitMQ
- Redis
- 单机安装
- 主从复制
- 主从复制+哨兵
- cluster集群
- 持久化方案
- MySQL
- 单机安装
- 主从复制
- 主从切换
- 主主复制
- 高可用
- 分表分库
- Canal数据库日志解析消费
- Canal安装
- 实时同步数据到ElasticSearch
- FastDFS
- docker安装
- centos安装
- 项目管理系统
- 禅道
- 111