我有三台服务器
- frontend-server-1
- frontend-server-2
- 后端服务器
和三个域
- client-1.com
- client-2.com
- api.com
一台服务器对应一个域。
另一个条件:
- 用户可以使用在api.com下运行的client-1.com或client-2.com。
- 所有对api.com的请求都来自用户的浏览器
- 所有ajax请求都包含X-Auth-Token标头,而不是cookie。
- 所有OAuth2应用程序都必须定位到api.com(因此它们只能在api.com/auth / ...上重定向)
- 所有请求都通过HTTPS
我已经了解了很多有关OAuth2 csrf的信息,所以我设计了一种更合适的身份验证流程,并希望确保它不受攻击。
- 浏览器将参数为“ redirect_to = client-N.com / oauth / complete”的ajax POST请求发送到“ api.com/auth-begin”
-
后端服务器检查是否允许redirect_to地址和响应,
- auth-token(如果未登录用户,则它是用于进一步身份验证的匿名令牌,否则是他的实际身份验证令牌)
- csrf令牌
- 状态为= urlencoded(redirect_to = redirect_to&csrf-token = token)的oauth-redirect-url(例如“ github.com/oauth2 /...”)
-
浏览器将auth-token和csrf-token保存到client-N.com的SessionStorage
-
浏览器转到oauth-redirect-url(第三方网站)
-
第三方站点响应并重定向到“ api.com/oauth2-process?state=my_state&3rd-party-code=my_code”
-
浏览器转到“ api.com/oauth2-process?state=my_state&3rd-party-code=my_code”
-
后端服务器从“状态”中读取“ redirect_to”,并将响应重定向到带有“状态”和“第三方代码”的“ client-N.com”
-
浏览器转到重定向页面“ client-N.com”
-
浏览器使用
将ajax POST请求发送到“ api.com/auth-end”
- 参数“状态”
- 参数“第三方代码”
- 标头X-Auth-Token(来自SessionStorage的auth-token)
- 标头X-Csrf-Token(SessionStorage中的csrf-token)
-
后端服务器检查“ csrf令牌”是否从“状态”等同于X-Csrf令牌
- 后端服务器通过将3rd-party-code交换为3rd-party-token来完成oauth2,如果用户登录则生成新的X-Auth-Token,否则令牌保持不变,并使用X-Auth-Token响应浏览器< / li>
所以主要问题是:有什么方法可以攻击此身份验证流?