前段时间我们需要一个多个Web服务之间的单点登录身份验证解决方案.至少在那个时候我们认为OpenID协议过于复杂,我们不相信它的Ruby on Rails插件.因此,我们设计了自己的协议,而不是实现OpenID提供者和OpenID使用者.
不创建我们自己的OpenID提供商并设置我们的OpenID消费者只接受它是不是一件坏事吗?不允许公开登录或注册,我们希望简化身份验证.
您能否在以下设计中发现关键错误或漏洞?
如果你作为一个公社可以批准这个设计,我会考虑将这个代码提取到Ruby on Rails插件中.
请查看流程图和顺序图.
身份验证提供程序("AP"):
身份验证客户端(服务"S"):
演员("A"):
"A","S"和"AP"之间的连接由HTTPS保护.
这些是对本文顶部链接的图形流程图和序列图的描述.
1)Auth Provider"AP"
2)服务"S"
备注:
如果其他人也可以解密身份验证令牌,这不是问题,因为它不包含有关用户的机密信息.但是,除AP之外的其他任何人都无法生成有效的身份验证令牌.因此涉及RSA密钥对.
RSA私钥仅用于对令牌进行签名,因为它无法加密长度超过实际密钥长度的数据.因此,AES用于加密.
由于身份验证令牌是作为HTTP GET请求传递的,因此它将存储在例如Apache的日志文件中.使用一次性随机数和失效日期应尽量减少重放攻击的可能性.POST请求需要一个HTML页面,其中包含由Javascript自动提交的表单,这就是使用GET的原因.
服务"S"仅在服务器到服务器API请求中生成随机数.因此,未经身份验证的生成请求不应构成DoS漏洞.