我在为客户的网站开发一个应用程序。故事是这样的,这家公司使用了一个名为synology的应用程序/ HDD,它基本上是一个连接到互联网的HDD盒,它允许预先创建帐户的客户端访问文件。这个接口是用CGI写的,我无法访问这个盒子(与网站不同的网络和位置)。
我们想要做的是允许一个登录表单从主网站(我正在构建)绕过(至少对用户:D)应用程序登录表单。
显然,我不能对不同的域执行jQuery ajax请求,它不能工作。所以我做的是
( 1)与jQuery合作的网站上的表格:
$("#login_submit").click(function(){
var username= $("input#login_username").val();
var passwd= $("input#login_passwd").val();
var post_string = "username=" + username + "&passwd=" + passwd ;
$.ajax({
type : "POST",
url: "login.php",
data : post_string,
success: function(response){
if (response){
$('.result').html("OK");
window.location = "http://XX.XX.net:5000/webman/index.cgi";
}
else {
$('.result').html("INVALID");
}
}
})
return false;
}2)在提交时通过POST调用login.php页面,通过POST传递用户和密码,page向远程语法服务器发出HTTP请求,并以JSON显然给出响应(?)我把它转换成一个PHP数组,这样我就可以看到“成功”键是真还是假,如果是真的,jquery代码将打印一条OK消息并重定向到远程系统服务器,在那里我可以访问我的数据登录!
<?php
function do_post_request($url, $data, $optional_headers = null)
{
$params = array('http' => array(
'method' => 'POST',
'content' => $data
));
if ($optional_headers !== null) {
$params['http']['header'] = $optional_headers;
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if (!$fp) {
throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
throw new Exception("Problem reading data from $url, $php_errormsg");
}
return $response;
}
if ($_SERVER['REQUEST_METHOD'] == "POST"){
$username = $_POST["username"];
$passwd = $_POST["passwd"];
$response =json_decode(do_post_request($url = "http://XX.XX.net:5000/webman/login.cgi", $data = "username=".$username."&passwd=".$passwd), true);
if($response["success"]){
$send = true;
}
else {
$send = false;
}
echo $send;
}这里的问题是,login.cgi页面应该为该服务器设置一个会话cookie,但是使用这个PHP请求它就不会了,它会给出响应,但不会将cookie设置为浏览器。您知道我在维护jquery函数的同时,如何模拟后浏览器请求并设置cookie吗?也许我应该设置一些标题?如果将这个login.cgi作为“动作”做一个简单的表单,那么会话cookie是,但是用户当然会保留在我无法更改的页面上,因为我没有访问它的权限。
发布于 2010-09-13 16:36:56
使用stream_get_meta_data()提取从服务器<->语法请求返回的headers。如果代码的其余部分与适当的synology /参数一起正常工作,则从登录请求返回的标头应该包含对synology框上的进一步请求进行身份验证所必需的会话cookie。
然后,您可以将其存储在服务器<->用户通信的会话文件中,并为后续请求提取它。
评论后续行动:
是的,没错。由curl发起的请求完全由服务器端完成,完全不涉及客户端。虽然您可以通过curl检索synology会话/访问cookie,但无法将该cookie发送到客户端,使其看起来像是直接来自synology框。
例如,让我们假设头看起来如下所示:
Set-Cookie: sessionID=blahblahblah; path=/; domain=synologybox.com提取会话ID并将其转发给客户端:
setcookie("sessionID", 'blahblahblah', 360000, '/');然后客户端会将其存储为来自yourserver.com,而不是synologybox.com。此外,您也无法通过setcookie调用设置域:
setcookie("sessionID", 'blahblahblah', 360000, '/', 'synologybox.com')这是行不通的,因为服务器<->客户端请求来自yourserver.com,它与synologbox.com完全不同。
如果没有对synology框的任何访问来入侵额外的身份验证设施,您很可能不得不构建一个完整的synology接口代理版本。
发布于 2010-09-13 15:21:15
如果您使用PHP进行此请求,则cookie将发送到您的服务器,而不是客户端。您不能从您的应用程序中为另一个域设置cookie,因此这是行不通的。你需要坚持客户端的方法。
https://stackoverflow.com/questions/3701769
复制相似问题