将Google Apps脚本从OAuth 1.0 OAuthConfig API和UrlFetchApp.addOAuthService迁移到OAuth 2.0

时间:2015-04-15 19:37:39

标签: google-apps-script google-oauth google-apps google-oauth2

我有几个关键的Google Apps脚本是"容器绑定"在Google表格电子表格中。他们拨打Google Admin SDKDirectory API和其他一些Google API,例如URL Shortener API

我最初通过谷歌搜索和搜索Stack Overflow工作,直到我发现代码完成了我需要的工作。

他们现在工作正常,但在过去的一个月里,我一直在接收来自Google的电子邮件,其中OAuth 1.0已被弃用,使用它的任何内容都应在2015年4月20日之前迁移到OAuth 2.0。

我阅读了他们的官方文档和迁移指南,但仍然非常困惑。他们的所有文档似乎都是针对"应用程序"我找不到任何特定于Google Apps脚本和Javascript的内容。

以下是我使用的Google Apps脚本的示例。它需要一个电子邮件地址作为输入并返回用户的全名。

var consumerKey = "domain.com";
var consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxx";
var publicApiAccessKey = 'xxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxx';

function getUsersName(email) {

  var name = '';

  try {

    var url = 'https://www.googleapis.com/admin/directory/v1/users/' + email + '?key=' + publicApiAccessKey;
    var scope = "https://www.googleapis.com/auth/admin.directory.user.readonly";

    var fetchArgs = googleOAuth_("Users",scope);
    fetchArgs.method = "GET";
    fetchArgs.muteHttpExceptions=true;

    var userJson = UrlFetchApp.fetch(url, fetchArgs);

    var userObject = JSON.parse(userJson);

    name = userObject.name.fullName;

  } catch(e) {

    // send failure email

  }

  return name;

}

function googleOAuth_(name,scope) {

  var oAuthConfig = UrlFetchApp.addOAuthService(name);
  oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope=" + scope);
  oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
  oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
  oAuthConfig.setConsumerKey(consumerKey);
  oAuthConfig.setConsumerSecret(consumerSecret);
  return {oAuthServiceName:name, oAuthUseToken:'always'};

}

当我运行它时,我会收到这些警告提示,确认我的Google Apps脚本使用的代码已被弃用且应予以替换:

execution hints

以下是Google发出的通知客户已弃用服务的电子邮件文本:

  

提醒ClientLogin,OAuth 1.0,AuthSub和OpenID 2.0关闭   您好管理员,

     

在过去几年中,我们宣布了ClientLogin,OAuth 1.0   (3LO),AuthSub和OpenID 2.0已弃用,将关闭   2015年4月20日。谷歌正在逐步摆脱这些旧协议   为了集中支持最新的互联网标准OAuth 2.0   和OpenID Connect。

     

分析我们的日志会让我们相信您的域名   domain.com运行一个或多个仍然使用一个的应用程序   这些已弃用的协议。你需要确保你的   应用程序使用我们支持的身份验证方法:OAuth 2.0 for   API授权或OpenID Connect用于联合身份验证。该   迁移到这些新标准的最简单方法是使用Google   登录SDK(请参阅迁移文档)。 Google登录是   建立在我们的OAuth 2.0和OpenID Connect基础架构之上   为身份验证和授权流程提供单一界面   在Web,Android和iOS上。

     

如果之前没有完成这些应用程序的迁移   截止日期,应用程序将遇到其中断的能力   连接到谷歌(可能包括登录的能力)直到   发生迁移到支持的身份验证协议。避免   任何服务中断,您都需要进行迁移   在关闭日期之前。

     

如果您需要迁移与Google的集成:

     

从OpenID 2.0迁移到Google登录(OpenID Connect)。迁移   来自OAuth 1.0 to OAuth 2.0。对于AuthSub和ClientLogin,没有   迁移支持。您需要重新开始使用OAuth 2.0和用户   需要重新同意。如果您有任何技术问题   迁移您的应用程序,请将问题发布到Stack Overflow   在标签google-oauth或google-openid下。请记住这一点   Stack Overflow是一个可公开查看的论坛。我们的工程师将是   定期通知任何已发布的问题。

我阅读了Migrating from OAuth 1.0 to OAuth 2.0部分,但我仍然不知道我应该做些什么。我需要具体了解我需要在上面的代码中进行更改,以便我的脚本在4月20日(下周一)之后继续工作。

1 个答案:

答案 0 :(得分:2)

转换它需要两个步骤:

1)您需要在脚本中添加Oauth2 Web流。您可以通过以下方式获得谷歌开发的库: https://github.com/googlesamples/apps-script-oauth2

查看此仓库中的README.MD,了解如何设置它。

2)更改您的电话以使用Oauth2令牌:

function getUsersName(email) {
var token = oauth2Service().getAccessToken(); //this will be setup from step 1
  var name = '';

  try {

    var url = 'https://www.googleapis.com/admin/directory/v1/users/' + email;


   var parameters = { method : 'get',
                headers : {'Authorization': 'Bearer '+ token},
                contentType:'application/json',                    
                muteHttpExceptions:true};

    var userJson = UrlFetchApp.fetch(url, parameters);

    var userObject = JSON.parse(userJson);

    name = userObject.name.fullName;

  } catch(e) {

    // send failure email

  }

  return name;

}