我正在制作angularjs cordova应用程序。要登录,我们必须向另一个域执行第一次/login
请求,并且响应中有一个名为cookie
的条目,其中包含我们必须设置的cookie才能登录。
问题在于,当我使用ionic serve
开发时(所以在我的浏览器中),有一个叫做CORS的可怕的东西。由于我想要连接的其他站点不允许CORS,因此我被迫使用node-http-proxy
代理,代理请求并添加CORS头。然后,当我需要连接到其他网站时,我在我的代理上发出了请求。但现在我需要按照之前的说明登录。
所以我将这段代码放到我的代理中,该代理解析/login
路由的响应并简单地提取cookie:
connect.createServer(
function(req, res, next) {
res.oldWrite = res.write;
var body = ""
res.write = function(data) {
body = data.toString('UTF8')
cookie = (/<cookie><!\[CDATA\[wenvjgol=(.+)\]\]><\/cookie>/g.exec(
body) || ["", undefined])[1]
if (cookie) console.log('found cookie: ' + cookie)
res.oldWrite(data);
}
...
if (cookie) {
res.setHeader('Set-Cookie', 'wenvjgol=' + cookie +
'; Domain=otherwebsite.com; Path=/; Expires=' + new Date(Date.now() +
1000 * 3600 * 24).toUTCString())
}
next();
},
function(req, res) {
if (req.method === "OPTIONS") {
res.end();
return;
}
proxy.web(req, res);
}
).listen(8101);
现在,当我到达/login
时,我看到了
cookie found: 1gmriba47wlc4ow4k88k8o8044gskso8sc4s0c8k40gcs44g8og40c8sks00so8og
由于某些原因,第一次请求未设置cookie。所以我在另一台服务器上的某个地方发出第一个请求(总是通过代理)。
在响应标题中有
Set-Cookie: wenvjgol=1gmriba47wlc4ow4k88k8o8044gskso8sc4s0c8k40gcs44g8og40c8sks00so8og; Domain=anotherdomain.com; Path=/; Expires=Tue, 21 Oct 2014 11:23:55 GMT
Chrome检测到它。但是,当我想向网址发出请求并且必须登录时,没有cookie,不在请求中,也不在响应中:(
这就是我在角度方面的表现:
$auth.login($event).then (sid) ->
console.log 'sid is', sid
$http(
method: "GET"
url: "#{config.domain}/forums"
withCredentials: true
# headers:
# "Cookie": "wenvjgol=#{sid}"
)
.then ->
$http(
method: "GET"
url: "#{config.domain}/forums/5-#{$routeParams.id}-#{$routeParams.topic}-1-0-1-0-0.xml"
withCredentials: true
# headers:
# "Cookie": "wenvjgol=#{sid}"
)
.then console.log
完整的代理文件位于:https://gist.github.com/vinz243/fd01b77ef309101976a5
我希望我很清楚。