我正在使用Contacts API v3在Google Apps脚本网络应用中工作,以访问域内所有用户的联系人。
到目前为止我对Contacts API请求没有任何问题,但我还不知道如何通过域获取授权来访问任何用户的联系人(除了我)。
我从cpanel尝试了OAuth域密钥 - 高级工具,到目前为止还没有结果。在尝试与域内的其他用户
时,我收到“请求失败的返回代码403(禁止)”提前致谢,Fausto
EDIT-1(Mar.05)我现在离我很近了,但需要一些帮助
我已将2LO(2-legged OAuth)与oauth_signature和签名请求相结合,但仍然收到错误401(客户端错误)!! 1。这是我现在正在使用的示例代码。
function test_xOAuth() {
// OAUTH_CONSUMER_SECRET from GApps: control panel > advanced tools > Manage OAuth domain key
var domain = Session.getEffectiveUser().getEmail().split("@")[1];
var xuser = 'fausto@thexs.ca';
var method = "GET";
var baseUrl = "https://www.google.com/m8/feeds/groups/default/full";
var timestamp = getTimestamp();
var paramsJson = {
oauth_consumer_key : domain,
oauth_nonce : getNonce(timestamp),
oauth_signature_method : "HMAC-SHA1",
oauth_timestamp : timestamp,
oauth_version : "1.0"
};
var paramsStringArray = [];
for (var k in paramsJson) paramsStringArray.push(k + '="' + paramsJson[k] + '"');
var paramsString = paramsStringArray.join("&") + '&xoauth_requestor_id=' + xuser;
var signatureBaseString = method +"&"+ encodeURIComponent(baseUrl) +"&"+ encodeURIComponent(paramsString);
var signatureBytes = Utilities.computeHmacSha256Signature(signatureBaseString, OAUTH_CONSUMER_SECRET);
var signature = Utilities.base64Encode(signatureBytes);
var xoauthString = 'OAuth ' + paramsStringArray.join(",") + ',oauth_signature="' + signature + '"';
var options = {
method : method,
headers : {"Authorization" : xoauthString}
}
var url = baseUrl + '?xoauth_requestor_id=' + 'fausto@thexs.ca';
var response = UrlFetchApp.fetch(url, options);
var responseHeader = response.getHeaders();
var responseText = response.getContentText();
return HtmlService.createHtmlOutput(responseText);
}
var getTimestamp = function(){
return (Math.floor((new Date()).getTime() / 1000)).toString()
}
var getNonce = function(timestamp){
return timestamp + Math.floor( Math.random() * 100000000)
}
提前感谢您的帮助!!福斯托
答案 0 :(得分:2)
首先,在计算签名之前,应对所有参数进行正确的URL编码。 第二,剥离引号,你真的不需要它们,特别是在基本字符串中。 第三,你应该使用你指定的签名方法,即HMAC-SHA1。最后但并非最不重要的是,尽管您没有使用OAuth令牌,但仍需要包含“&”在加密密钥中。
以下是正常运行的代码:
var OAUTH_CONSUMER_SECRET = 'you secret goes here';
var domain = 'domain.tld';
var username = 'test.user';
var xuser = encodeURIComponent(username+'@'+domain);
var method = "GET";
var baseUrl = "https://www.google.com/m8/feeds/groups/default/full";
var timestamp = Math.round(new Date().getTime() / 1000);
var paramsJson = {
oauth_consumer_key : domain,
oauth_nonce : timestamp,
oauth_signature_method : "HMAC-SHA1",
oauth_timestamp : timestamp,
oauth_version : "1.0"
};
var paramsStringArray = [];
for (var k in paramsJson) paramsStringArray.push(k + '=' + encodeURIComponent(paramsJson[k]));
var paramsString = paramsStringArray.join("&") + "&xoauth_requestor_id="+xuser;
var signatureBaseString = method +"&"+ encodeURIComponent(baseUrl) +"&"+ encodeURIComponent(paramsString);
var signatureBytes = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_1, signatureBaseString, OAUTH_CONSUMER_SECRET+'&');
var signature = encodeURIComponent(Utilities.base64Encode(signatureBytes));
var xoauthString = 'OAuth ' + paramsStringArray.join(", ") + ', oauth_signature="' + signature + '"';
var options = {
method : method,
headers : {authorization: xoauthString}
}
var url = baseUrl + '?xoauth_requestor_id=' + xuser;
var response = UrlFetchApp.fetch(url, options);
答案 1 :(得分:0)
我没有像您在此处提到的那样访问联系人,但我已设法执行类似操作以充当域用户并访问用户Google驱动器,这样做的一个限制因素是能够执行此操作您要做的是您必须成为Google域的超级管理员,我必须使用的访问级别是通过URL请求和REST API,您还可以查看Google Domain Shared Contacts API来查看能够管理您在Google域中的共享联系人,并让每个人的个人联系人都由他们自己管理