notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • 项目简介
  • 知识点
  • 方案设计
  • 未授权时支持302跳转和401响应
  • 非cookie形式认证
  • 前后端分离项目
  • JWT
  • 会话session
  • Oauth2.0
  • 优化点
  • OAuth2.0授权与单点登录的区别
  1. wheels
  2. sso

方案设计

项目简介

sso + oauth(单点登录和开放授权)

知识点

并不是所有系统支持cookie机制,所以需要使用token机制。

方案设计

SSO系统生成一个token,并将用户信息存到Redis中,并设置过期时间,其他系统请求SSO系统进行登录,得到SSO返回的token,写到Cookie中,每次请求时,Cookie都会带上,拦截器得到token,判断是否已经登录

未授权时支持302跳转和401响应

前后端分离方式,这种方式下业务方调用后端的接口时不希望得到302跳转,而是得到一个未授权的结果,在以下两个条件之一满足时:

  1. ContentType为application/json或application/xml

  2. 请求携带Header,x-requested-with:XMLHttpRequest

非cookie形式认证

同样在前后端分离场景中,当业务方调用后端接口时不方便传递cookie时(例如涉及到跨域cookie种植的问题),可以使用在请求头添加“access-token”和"client-id"的方式向后端请求接口,该方式等同于携带${clientId}_ssoid(即access-token)的cookie

POST /index.html (or /api/getdata) HTTP/1.1 //适用普通请求和ajax请求
access-token:${ssoid} //放置在Header里,其中ssoid由应用鉴权方负责获取
client-id:$(clientId) //颁发对应ssoid的clientId

前后端分离项目

由于cookie存在跨域问题,前后端域名不同的时候,需要由前端来完成种cookie的操作

JWT

会话session

使用全局会话和局部会话,集群存在session共享问题,同时服务端消耗过大。

Oauth2.0

基于oauth协议登录,每次访问向sso-server验证token

优化点

  1. Nginx的rewrite解决方案

  2. 当用户长时间不登录,cookie过期,如何使用refresh token 来重新刷新 access token

OAuth2.0授权与单点登录的区别

根据OAuth2.0授权与单点登录的概念,我们可以得知二者至少存在以下几点区别:

  • 从信任角度来看。OAuth2.0授权服务端和第三方客户端不属于一个互相信任的应用群(通常都不是同一个公司提供的服务),第三方客户端的用户不属于OAuth2.0授权服务端的官方用户;而单点登录的服务端和接入的客户端都在一个互相信任的应用群(通常是同一个公司提供的服务),各个子系统的用户属于单点登录服务端的官方用户。

  • 从资源角度来看。OAuth2.0授权主要是让用户自行决定——“我”在OAuth2.0服务提供方的个人资源是否允许第三方应用访问;而单点登录的资源都在客户端这边,单点登录的服务端主要用于登录,以及管理用户在各个子系统的权限信息。

  • 从流程角度来看。OAuth2.0授权的时候,第三方客户端需要拿预先“商量”好的密码去获取Access Token;而单点登录则不需要。

参考资料:

  1. https://juejin.im/post/5cdd42f9518825693f1ebf8d

  2. http://www.ruanyifeng.com/blog/2019/04/github-oauth.html

  3. https://www.zhihu.com/topic/19730683/hot

Previoussso

Last updated 3 years ago