首先,如果您认为这应该放在 stackoverflow.com 上,我深表歉意 - 它似乎更适合这个网站,但有点边缘。
我们有一个合作伙伴网站,我将它称为http://bob.com
。为了便于讨论,我的网站称为http://alice.com
。我对 有完全控制权alice.com
,但对 没有任何控制权bob.com
。但是,我可以要求bob.com
更改他们的网站,尽管他们不愿意这样做。情况是,如果我提出的更改请求 A) 很小且 B) 定义非常明确,则更有可能实施。因为我自己有 bob.com 的登录名,所以我可以看到他们的请求、路径、参数等是如何构成的。
这就是背景。我想解决的问题是:假设我们有一个用户 Jimmy,他的账号是alice.com
。在我们的 alice.com 数据库中,我当然有 Jimmy 的用户名和密码(我是否加密它们在这里并不重要)。Jimmy 还有一个 的登录名bob.com
,并且在我的alice.com
数据库中我也有他的bob.com
用户名和密码。
我想在我的alice.com
网站上有一个按钮,用于让 Jimmy 登录bob.com
。简单来说,这个按钮会向bob.com
登录 URL 提交一个表单,并在适当命名的参数中传递 Jimmy 的用户名和密码。 bob.com
将接受此请求,然后 Jimmy 现在将登录bob.com
。
阻止这种情况发生的是bob.com
使用与 cookie 绑定的身份验证令牌的 CSRF(跨站点请求伪造)保护系统。我可以尝试解决这个问题的方法是向登录页面发出 ajax 请求,从响应中读取身份验证令牌,然后再次通过表单请求传递该令牌。但是这样做有两个问题:
1)如果我尝试发出 ajax 请求,请求会被拒绝,因为响应没有标头“Access-Control-Allow-Origin:http://alice.com“,我相信这对于使 ajax 请求工作是必要的 - 来自此处的 CORS 部分http://jquery-howto.blogspot.co.uk/2013/09/jquery-cross-domain-ajax-request.html
2) 即使我设法使用 ajax 获取身份验证令牌(即绕过 CORS 内容),我也不确定请求是否会起作用,因为它来自不同的域。我可以在 CURL 中管理它,通过保存 cookie 并在后续请求中传递它,从命令行成功登录,但我认为浏览器的规则不同,我无法完全理解它。
所以,(抱歉,这拖延了一段时间),我的问题是:
bob.com
我可以要求对他们的网站进行什么样的最简单的改变,以允许有人alice.com
登录bob.com
,如果alice.com
知道他们的bob.com
用户名和密码?
我对 Ajax 和 CORS 的理解正确吗?如果正确,那么我是否需要要求他们为我们的网站设置访问控制,仅用于登录提交?