我是cURL的新手。
当我在jquery / ajax中进行以下GET时,我在响应中收到HTML,创建一个弹出登录窗口(oauth2)。
当我在后端php脚本中使用以下代码命中同一个端点时,我会返回一个可点击的链接...当点击该链接时会转到登录页面。
我错过了什么?
PHP
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://oauthserverxxx.com//login/oauth2/auth?client_id=11111&response_type=code&scope=/auth/userinfo&redirect_uri=http://localhost/oauth_complete.php");
$result = curl_exec($curl);
来自cURL的回复
您正在被重定向.bool(true) 1
AJAX / jquery
$.ajax({
type: "GET",
url: "https://client.instructure.com//login/oauth2/auth?client_id=6666&response_type=code&redirect_uri=http://oauth_complete.php",
// dataType: 'html',
processData: true,
success: function(canvasAuthHTML) {
$('#flexModalHeader').html('Login...');
$('#flexModalMsg').html(canvasAuthHTML);
$('#flexModal').modal('show');
console.log('Called Canvas - response: ' + canvasTok);
},
error: function (data) {
console.log('Fail - could not get LTI auth token...');
chrome.runtime.sendMessage({ msg: "oauthLTI", token: "failed"});
}
});
响应 这将弹出登录表单里面的模式 - 来自服务器的响应是详细的HTML。
答案 0 :(得分:0)
可能有几件事,
首先,jQuery请求可能使用预先存在的cookie会话,你的curl请求没有任何cookie。
第二,jQuery请求跟在"Location" http-header-redirects之后,你的curl代码没有,但如果这是问题,你可以通过将CURLOPT_FOLLOWLOCATION设置为1来指示curl执行相同的操作。
第三,jQuery请求有一个用户代理字符串,你的curl请求没有(libcurl没有默认的用户代理.curl cli程序有,但libcurl,你通过php的curl_函数使用,没有。),一些网站阻止没有用户代理的请求。如果这是问题,你可以简单地复制jQuery的用户代理字符串并告诉curl将它用于CURLOPT_USERAGENT
第四,默认情况下,大多数浏览器尽可能使用压缩,但您的curl请求不支持压缩。不太可能,但可能的是,服务器处理卷曲请求的方式不同,因为它不支持压缩传输,如果这是问题,您可以通过卷曲请求启用压缩将CURLOPT_ENCODING设置为emptystring(这将启用libcurl编译的所有压缩,通常是gzip和deflate) - 实际上,我建议不管怎么做,因为你正在抓取HTML,压缩得非常好,所以除非你的cpu非常慢,它也会使代码执行得更快。这与浏览器默认执行此操作的原因相同。
.-找到罪魁祸首最可靠的方法是记录两个请求,并排比较它们,并逐一取消2个请求中的每个差异,直到请求相同。迟早,你会发现服务器响应不同的差异(我最好的猜测是位置重定向),为此,我推荐程序FiddlerProxy