【问题标题】:Authorization for Contacts API across domain access using Google Apps Script使用 Google Apps 脚本对跨域访问的联系人 API 进行授权
【发布时间】:2013-02-10 21:35:48
【问题描述】:

我正在使用 Contacts API v3 在 Google Apps Script Web 应用程序中工作,以访问域内所有用户的联系人。

到目前为止,我对联系人 API 请求没有任何问题,但我还不知道如何获得跨域的授权以访问任何用户的联系人(除了我之外)。

我已尝试使用 cpanel - 高级工具中的 OAuth 域密钥,但到目前为止没有任何结果。与域内的其他用户一起尝试时,我收到“请求返回代码 403(禁止)失败”

提前致谢,福斯托

EDIT-1(3 月 5 日)我现在更近了,但需要一些帮助

我已将 2LO(2 腿 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)
}

提前感谢您的帮助!福斯托

【问题讨论】:

  • 不确定你是否感兴趣,但你看过 Romain Vialard 带来的new library 吗?
  • 确实很感兴趣,已经看过了。但是,这是针对位于域级别的配置文件 api,而我需要的是联系人 api,它需要 2 条腿访问权限才能在所有域用户的联系人中工作……我猜(目前还不确定)
  • 使用Google APIs Console 代替域cpanel 域密钥来设置API 访问配置文件,该配置文件将生成一个简单的API 访问令牌。
  • 我对@Jonathon 的建议感到很兴奋,但是当我在 API 控制台上创建一个新项目时,我在可用的服务中找不到联系人 API 来激活......我错过了什么吗?
  • 它不需要特定的激活(我想我记得它曾经是)但这是管理应用特定访问令牌的最佳方式

标签: google-apps-script google-api google-contacts-api


【解决方案1】:

首先,您应该在计算签名之前正确地对所有参数进行 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);

【讨论】:

  • 非常感谢,你让我的脚走上了正确的道路......答案是什么!
【解决方案2】:

我没有像您在这里提到的那样执行对联系人的访问,但我已经设法执行类似的操作来充当域用户并访问用户 Google 驱动器,对此的一个限制因素是能够做到您要做的是您必须成为您的 Google 域的超级管理员,并且我必须使用的访问级别是通过 URL 请求和 REST API,您可能还需要查看Google Domain Shared Contacts API 能够管理您在 Google 域中的共享联系人,并将每个人的个人联系人留给他们自己管理

【讨论】:

  • 您能否分享一下如何在 Drive API 案例中管理 2-legged 身份验证(假设 Contacts API 类似)? // 共享联系人不需要 2-legged Auth 并且不适合这种要求 @user2111108
猜你喜欢
  • 2012-10-02
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2020-06-05
相关资源
最近更新 更多