如何使用AWS Cognito实现统一SSO,对接多技术栈跨域名业务项目
方案一:OAuth 2.0 授权码模式(优先推荐)
这是跨域名、跨技术栈SSO的工业标准方案,完全不需要复用现有认证页面代码,适配你提到的所有技术栈,你已经开发完成的sso.mycompany.com认证页面不需要做任何改造,AWS Cognito原生支持这套流程:
- 核心逻辑:你现有部署在sso.mycompany.com的认证服务直接作为OAuth2.0的授权服务器,各业务项目作为客户端
- 接入流程:
- 提前为每个业务项目(projectx.com、projecty.com等)在Cognito后台分配唯一的
client_id、client_secret,配置允许的回调地址 - 业务项目需要登录时,直接跳转/弹窗打开
https://sso.mycompany.com/login?client_id=xxx&redirect_uri=业务项目回调地址&response_type=code&state=随机串 - 用户在已开发的Cognito认证页完成登录后,Cognito会自动携带授权码
code跳转到业务项目的回调地址 - 业务项目后端拿到
code后,调用Cognito的token接口用code+client_id+client_secret换id_token、access_token,解析id_token就能拿到用户ID、邮箱、昵称等公开信息
- 提前为每个业务项目(projectx.com、projecty.com等)在Cognito后台分配唯一的
- 不同技术栈适配成本:
- Laravel 直接用官方Passport扩展或者socialite提供的Cognito驱动,100行代码内即可完成接入
- Wordpress 可以直接用OAuth客户端插件,无需写代码,后台配置参数即可接入
- React 项目可以用
react-oauth2-code-pkce库,前端配合后端简单配置即可
- 优势:安全等级最高,支持token过期自动刷新,完全符合Cognito的原生设计,后续扩展权限、第三方接入都不需要改现有认证页
方案二:iframe + postMessage 轻量方案
如果你的业务项目都是内部可信项目,不想做完整的OAuth流程,可以用你原本设想的iframe方案,仅需要对现有Vue认证页做少量改造:
- 改造&接入步骤:
- 提前在sso.mycompany.com的Cognito配置里,把所有业务域名加到CORS白名单
- 业务项目嵌入iframe时,url带一个
origin参数,值为当前业务项目的域名,比如https://sso.mycompany.com/login?origin=https://projectx.com - 现有Vue认证页中监听Cognito的登录成功事件,拿到用户的
id_token、用户信息后,执行以下代码:
// 首先校验origin参数在你预先配置的可信域名列表里,防止信息泄露 const allowedOrigins = ['https://projectx.com', 'https://projecty.com', 'https://mycompany.com'] const targetOrigin = new URLSearchParams(window.location.search).get('origin') if (allowedOrigins.includes(targetOrigin)) { window.parent.postMessage({ type: 'SSO_LOGIN_SUCCESS', data: { idToken: 'xxx', userInfo: { userId: 'xxx', email: 'xxx', nickname: 'xxx' } } }, targetOrigin) }- 业务项目的父页面监听message事件,接收认证成功的数据:
window.addEventListener('message', (e) => { // 必须校验消息来源是你的SSO域名,防止伪造消息 if (e.origin !== 'https://sso.mycompany.com') return if (e.data?.type === 'SSO_LOGIN_SUCCESS') { // 拿到用户数据后存到业务项目的本地存储/后端session,隐藏iframe即可 const { idToken, userInfo } = e.data.data } }) - 优势:改造成本极低,不需要调整业务项目的现有跳转逻辑,用户无需跳转在当前页即可完成登录
- 注意点:一定要做两次origin校验,防止跨站信息泄露或伪造登录请求,不建议对外网开放的第三方项目使用这个方案
内容的提问来源于stack exchange,提问作者João
相关产品推荐
相关产品推荐

