使用 PHP 和 Javascript 自动登录到我的网站时有什么问题


What is the issue when autologin using PHP and Javascripts to my site?

> 使用Javascript

var username = "user1";
var password = "user1";
jQuery.ajax({ 
    url : "http://domainname.com/rest/user/login.json",
    type : 'post', 
    data : 'username=' + encodeURIComponent(username) + '&password=' + encodeURIComponent(password), 
    dataType : 'json', 
    error : function(data) { console.log("error"); console.error(data); }, 
    success : function(data) { console.log("success"); console.info(data); } 
});

> 使用 PHP/curl

// Method: POST, PUT, GET etc
// Data: array("param" => "value") ==> index.php?param=value
function CallAPI($method, $url, $data = false)
{
    $curl = curl_init();
    switch ($method)
    {
        case "POST":
            curl_setopt($curl, CURLOPT_POST, 1);
            if ($data)
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_PUT, 1);
            break;
        default:
            if ($data)
                $url = sprintf("%s?%s", $url, http_build_query($data));
    }
    // Optional Authentication:
    //curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    //curl_setopt($curl, CURLOPT_USERPWD, "username:password");
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    return curl_exec($curl);
}
// Example
$method = "POST";
$url = "http://domainname.com/rest/user/login.json";
$rurl = "http://domainname.com/";
$postdata = array('username'=>'editor1', 'password'=>'editor1');
$response = CallAPI($method, $url, $postdata );
    print "<pre>";
    print_r($response);

结果:

{"sessid":"R03y8-40VBh6FDEIfi9Lnm2kh2SikCxY3105egCynDY","session_name":"SESS2063f746500d52bace78ba433478bd2d","user": ......

我正在尝试使用两个不同的脚本登录,一个来自JQuery,另一个来自PHP/Curl。

当我触发 JQuery 时,它正在自动登录成功工作。但是,当我尝试从 PHP/Curl 自动登录时,它会给我如上所述的成功响应,但是当打开的 URL 不会登录时,任何人都可以解释问题所在。

根据我的假设,Session_name/Sessid 可能存储在 cookie 中?

根据我的假设,Session_name/Sessid 可能存储在 cookie 中?

与许多其他引擎一样,Drupal 需要会话库克,看起来像 SESSa89ab839dd1casdasdec163e12679c2f2ea1e=asdfasdf2323423dsa。使用 setcookie (http://php.net/manual/en/function.setcookie.php) 在 php 中设置此 cookie(如 session_name=sessid),并向客户端发送响应。

l.我的问题是,当我们使用 PHP/CURL 的 jQuery instread 时,它会自动将 cookie 值添加到浏览器中?

当 Jquery 向服务器发送查询时,浏览器会得到带有 Set-Cookie 标头的响应,您可以使用 chrome 开发者工具(或浏览器的类似实用程序)进行检查。

当您在服务器端执行PHP代码时,PHP不会对响应cookie执行任何操作,因为PHP解释器不是浏览器。

看看这个虚拟查询方案:

1) JqueryWebBrowser => Apacher/PHP server (login.json code)Apacher/PHP 服务器 => 浏览器(使用会话 cookie 响应)

2)在php端登录Web 浏览器 => Apacher/PHP 服务器(您的脚本)Apacher/PHP server => Apacher/PHP (调用登录代码)Apacher/PHP 服务器 => Apacher/PHP 服务器(登录代码对第一个脚本的响应)


在这里,cookie 信息丢失了,因为它只是 php 代码中的 http 查询,仅此而已。不会自动设置任何标头。您需要使用 setkookie() 函数或 $_COOKIE 变量手动设置此 cookie。


Apacher/PHP 服务器 => Web 浏览器(使用您在当前脚本中设置的所有 cookie)

对不起我的语法,希望我能帮助你。