如何在没有刷新卷曲的情况下使用令牌进行登录

时间:2017-07-26 19:25:17

标签: php curl

我正在尝试登录网站(远程)让我们说example.com/login和example.com/login使用请求令牌登录,所以我从下面的网址获取请求令牌

// code for getting token cookies etc

    $url = 'http://example.com/login/';

    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    $doc = curl_exec($ch);
    curl_close($ch); 

// extract __RequestVerificationToken input field
     preg_match('#<input name="__RequestVerificationToken" type="hidden" value="(.*?)"#is', $doc, $match);


    $token = $match[1];

// code for redirect to dashboard 

$postinfo = "Email=".$username."&Password=".$password."&__RequestVerificationToken=".$token;
 // var_dump($token); //debug info
 $useragent="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";



curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);

$html = curl_exec($ch);
echo $html;

if (curl_errno($ch)) print curl_error($ch);
    curl_close($ch);

所以,即时获取令牌但是当尝试使用下一个curl请求登录时,显然$ token因刷新而不断变化,所以我想知道如何使用相同的curl脚本登录url example.com/login所以$令牌保持不变?!

TIA!

1 个答案:

答案 0 :(得分:1)

首先,正确的dom解析器比正则表达式提取令牌更可靠,所以使用它。

$token = (new DOMXPath(@DOMDocument::loadHTML($dom)))->query("//input[@name='__RequestVerificationToken']")->item(0)->getAttribute("value");

现在,令牌DEFINITELY会针对每个新的Cookie会话进行更改。每次失败的登录尝试都会发生可能的更改,并且每次仍然没有登录页面刷新时可能会发生更改。

现在,当您第一次获得令牌时,您还会获得一个cookie会话ID。要“使用正确的令牌登录”,您必须使用登录请求发送相同的会话cookie ID。最简单的方法是让curl自动处理cookie,使用CURLOPT_COOKIEFILE(ps,你不需要专门的cookie文件,只需设置一个emptystring和curl将为你处理cookie ) - 启用后,curl会自动发送会话cookie并显示下一个登录请求。

和protip:每当你调试curl代码时,启用CURLOPT_VERBOSE,它会提供很多有用的信息(比如显示你收到的所有cookie)