OAuth 2.0
OAuth(开放授权) 是一个开放标准, 允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息, 而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容
项目使用Gitee进行第三方登录,简化网站的登陆与注册逻辑
主要步骤
1.点击社交登录按钮,跳转到第三方授权页面
2.用户输入账号密码,跳转到第三方进行账号密码验证,如果通过,则回调成功的地址,并且返回一个code码信息来标识此用户登录
3.根据用户授权返回的code换取access_token(访问令牌),并且返回标志此用户的唯一UID
1.根据UID来判断是否曾经登录过,没有的话创建用户,使用访问令牌,访问受保护的信息
2.如果已经注册了更新用户的访问令牌的时间和access_token
3 .命令浏览器保存一个jsessionId
注意点:
- 使用Code换取AccessToken,Code只能用一次
- 同一个用户的accessToken一段时间是不会变化的,即使多次获取
分布式场景下的Session共享问题
session原理
session也是一种记录浏览器状态的机制,但与cookie不同的是,session是保存在服务器中。
由于http是无状态协议,当服务器存储了多个用户的session数据时,如何确认http请求对应服务器上哪一条session,相当关键。这也是session原理的核心内容
分布式下session共享问题
同一服务部署在多个服务器上,Session不能共享
Session 不能跨域名共享。不同服务,Session不能共享,子域Session 共享问题
Session共享问题解决–hash一致性
方式一:利用用户ip地址来做负载均衡,使某一用户永远都访问的是同一台服务器
方式二:利用用户id来做负载均衡,使某一用户永远都访问的是同一台服务器
Session共享问题解决–统一存储
将session 数据存储在redis中
问题二的解决不同服务,子域session共享
在存入session时jsessionid的作用域提升至最大.比如auth.gulimall.com->.gulimall.com,那么gulimall.com及其下面的所有子域名都可以拿到这个jsessionid,然后再去redis中查询对应的session信息,可以实现不同服务之间的session共享
相同服务之间的session共享使用,session存入redis即可解决问题,相同服务的域名是相同的jsessionid也是相同的
SpringSession整合redis
导入所需依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置session存储方式
spring:
redis:
host: 192.168.157.128
port: 6379
#使用redis存储session
session:
store-type: redis
server:
port: 20000
servlet:
#配置session过期时间
session:
timeout: 30m
SpringSession 底层原理
装饰者模式: SessionRepositoryFilter包装了Request 和 Response 应用到后面的整个执行链