无需用户提示与固定redirect URI的SSO解决方案咨询
可行的标准方案有两类,均不需要你从零实现认证逻辑:
方案1:OAuth 2.0 动态客户端注册(RFC 7591)
这是完全匹配你需求的OAuth扩展标准,专门解决客户端域名/回调地址无法提前预置的场景:
- 你可以提前给所有站点B的容器预置一个共享的注册密钥,站点B容器启动后,自动携带该密钥向站点A的客户端注册接口发起请求,提交当前实例的动态
redirect_uri - 站点A验证请求携带的注册密钥合法后,自动为该站点B实例下发唯一的
client_id和client_secret,完成注册,全程不需要人工介入 - 后续站点B就可以按照标准OAuth 2.0授权码流发起认证,已登录站点A的用户不需要重复输入凭证
- Django侧可以直接用
django-oauth-toolkit实现该能力,该库已经原生支持RFC 7591,你只需要额外给注册接口加一个自定义权限校验逻辑,只有携带预置合法密钥的请求才能完成注册即可,不需要从零开发适配逻辑
方案2:JWT跨域身份断言
如果不想引入完整的OAuth客户端注册逻辑,可以用这套更轻量的标准方案:
- 提前为每个站点B容器生成唯一的公私钥对,公钥预先同步到站点A存储,私钥保存在站点B容器内
- 用户访问站点B时,站点B弹出一个站点A的固定域名校验窗口,站点A检测到用户已登录后,生成一个带签名的JWT,JWT payload中包含用户身份、有效期、允许访问的站点B公钥指纹
- 站点A通过
postMessage将JWT传给站点B窗口,站点B验证JWT的签名合法后,即可拿到当前用户的身份信息 - 后续站点B调用站点A的API时,将该JWT放在
Authorization请求头中,站点A验证JWT签名、有效期、站点B指纹匹配后,即可完成授权 - 该方案完全不需要配置
redirect_uri,同时因为JWT绑定了站点B的密钥,就算域名被冒用也无法完成身份校验,满足你不信任域名的要求
内容的提问来源于stack exchange,提问作者Ben Davis
相关产品推荐
相关产品推荐

