表单身份验证,保留会话Google Apps脚本
问题描述:
我有一个Google Apps脚本与外部程序进行通信。该程序需要验证身份验证:表单身份验证,保留会话Google Apps脚本
“POST方法应该用于此,内容类型应该设置为”application/x-www-form-urlencoded“。用户名应该在参数“用户名”,密码应在参数“密码”中给出。因此,POST数据将会像“用户名 = XXX & 密码 = YYY”。请记住,当不发送用户名和密码的每个请求,会话(或保持它的对象)应该保持活着。“
这是工作:
var payload = "_UserName_="+username+"&_Password_="+password
var options = {
"method" : "POST",
"payload" : payload,
"contentType" : "application/x-www-form-urlencoded"
};
var xml = UrlFetchApp.fetch("https://start.application.nl/docs/XMLDivisions.aspx", options);
但在这里我想作下一个请求:
var xml = UrlFetchApp.fetch("https://start.application.nl/docs/XMLDownload.aspx?PartnerKey="+partnerKey+"&Topic=Accounts");
但没有通过认证?
我该如何让GAS会话保持活跃状态?
工作示例使用PHP:
<?php
$baseurl = "https://start.exactonline.nl";
$username = "<username>";
$password = "<password>";
$partnerkey = ""; /* If you have one, the partnerkey with or without curly braces */
$division = "<division code>"; /* Check the result of the first division retrieving for the division codes */
$cookiefile = "cookie.txt";
$crtbundlefile = "cacert.pem"; /* this can be downloaded from http://curl.haxx.se/docs/caextract.html */
/* Logging in */
$header[1] = "Cache-Control: private";
$header[2] = "Connection: Keep-Alive";
/* init, don't term until you're completely done with this session */
$ch = curl_init();
/* Set all options */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($ch, CURLOPT_CAINFO, $crtbundlefile);
curl_setopt($ch, CURLOPT_POSTFIELDS, array("_UserName_"=>"$username", "_Password_"=>"$password"));
/* Retrieving divisions, the current should be the one in which the user worked the last time */
$url = "$baseurl/docs/XMLDivisions.aspx";
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
/* Switching divisions */
$url = "$baseurl/docs/ClearSession.aspx?Division=$division&Remember=3";
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
/* Retrieving divisions, the current should now be the one supplied in the switching divisions. This is only the current for this session! */
$url = "$baseurl/docs/XMLDivisions.aspx";
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
/* Upload an xml file */
$topic = "Invoices";
$url = "$baseurl/docs/XMLUpload.aspx?Topic=$topic&PartnerKey=$partnerkey";
curl_setopt($ch, CURLOPT_URL, $url);
/* Send the xml along with the request */
$filename = "Invoices.xml";
$fp = fopen($filename, "r");
$xml = fread($fp, filesize($filename));
curl_setopt($ch, CURLOPT_POSTFIELDS, utf8_encode($xml));
$result = curl_exec($ch);
/* Finally close as we're finished with this session */
curl_close($ch);
echo $result;
?>
答
我认为你缺少的cookie。
尝试这样:
var payload = "_UserName_="+username+"&_Password_="+password
var options = {
"method" : "POST",
"payload" : payload,
"contentType" : "application/x-www-form-urlencoded"
};
var xml = UrlFetchApp.fetch("https://start.application.nl/docs/XMLDivisions.aspx", options);
var cookie = response.getAllHeaders()['Set-Cookie'];
然后,沿着你的其他准备头发送cookie中的第二个请求。
var header = {'Cookie':cookie};
var opt = {"headers":header};
var xml = UrlFetchApp.fetch("https://start.application.nl/docs/XMLDownload.aspx?PartnerKey="+partnerKey+"&Topic=Accounts",opts);
我认为应该工作,但有时服务器在cookie不是只需要会话,而且相同的IP地址应请求,在这种情况下,谷歌IP的有时会改变......
是否有任何理由不重新发送第二个呼叫的有效载荷? – Jonathon 2013-03-14 17:06:12
是的,这是一个调用XMLDownload获取数据。 当我想发布内容时,需要将有效负载设置为XML数据。 当我将有效负载与调用一起添加时,它是好的,但是我不能同时发送一个x-www-form-urlencoded用于auth和application/xml。 – 2013-03-14 19:32:27
这是如何使用PHP完成的: – 2013-03-14 19:47:57