使用 Google Apps 脚本配置 OAuth

Posted

技术标签:

【中文标题】使用 Google Apps 脚本配置 OAuth【英文标题】:Using Google Apps Script to configure OAuth 【发布时间】:2020-06-29 20:26:56 【问题描述】:

我在配置我的 Google Apps 脚本以正确处理来自我正在联系的 API 的令牌时遇到了一些问题。据我所知,一切都是兼容的。

我正在使用 Apps 脚本 oAuth2 here。

当我运行以下脚本时,我能够进入我在应用程序上验证的 oAuth 屏幕,当它在 usercallback 上将凭据传递回谷歌脚本时,我收到以下错误。

Error: Error retrieving token: "id":"401","name":"unauthorized","detail":"Unauthorized" (line 541, file "Service")

我的 oAuth 脚本如下:

var CLIENT_ID = '...1';
var CLIENT_SECRET = '...2';

// configure the service
function getYNABService() 
  return OAuth2.createService('YNAB')
    .setAuthorizationBaseUrl('https://app.youneedabudget.com/oauth/authorize')
    .setTokenUrl('https://api.youneedabudget.com/v1/budgets?access_token')
    .setClientId(CLIENT_ID)
    .setClientSecret(CLIENT_SECRET)
    .setCallbackFunction('authCallback')
    .setPropertyStore(PropertiesService.getUserProperties())
    .setScope('read-only')
    .setGrantType('authorization_code');



// Logs the redict URI to register
// can also get this from File > Project Properties
function logRedirectUri() 
  var service = getService();
  Logger.log(service.getRedirectUri());


// handle the callback
function authCallback (request) 
  var YNABService = getYNABService();
  var isAuthorized = YNABService.handleCallback(request);
  if (isAuthorized) 
    return htmlService.createHtmlOutput('Success! You can close this tab.');
   else 
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  

我的 Google 表格脚本如下

// add custom menu
function onOpen() 
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('YNAB for Sheets')
      .addItem('Authorize','showSidebar')
      .addItem('Fetch Budget','FetchBudgets')
      .addItem('Reset','reset')
      .addToUi();



/***************************************/
// Show sidebar for Authorization
function showSidebar() 
  var YNABService = getYNABService();
  if (!YNABService.hasAccess()) 
    var authorizationUrl = YNABService.getAuthorizationUrl();
    var template = HtmlService.createTemplate(
        '<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>. ' +
        'Reopen the sidebar when the authorization is complete.');
    template.authorizationUrl = authorizationUrl;
    var page = template.evaluate();
    SpreadsheetApp.getUi().showSidebar(page);
   else 
  // ...
  


function reset() 
  getYNABService().reset();



function FetchBudgets() 
  var YNABService = getYNABService();
  var response = UrlFetchApp.fetch('https://api.youneedabudget.com/v1/budgets/default/accounts', 
    headers: 
      Authorization: 'Bearer ' + YNABService.getAccessToken()
    
  );
  // ...

【问题讨论】:

经过深入调查,问题似乎是我的错。我混合了客户端/服务器端身份验证的 URL。 app.youneedabudget.com/oauth/token? - 这是正确的令牌 URL。 【参考方案1】:

经过深入调查,问题似乎是我的错。我混合了客户端/服务器端身份验证的 URL。

https://app.youneedabudget.com/oauth/token? - 这是正确的令牌 URL。

【讨论】:

您如何将凭据返回到 google 脚本? 将凭据带回 Google 脚本通常由您发送到的服务处理。通常有一个选项可以配置回调 URL,一旦完成登录,它就会将用户连同令牌负载一起发送到该 URL。 回调 URL 应该返回什么?

以上是关于使用 Google Apps 脚本配置 OAuth的主要内容,如果未能解决你的问题,请参考以下文章

javascript 这是一套Google Apps脚本(或Adwords Scripty)Oauth 2.0功能集。我们的想法是您可以使用它来启动OAuth 2.0流程

我是否需要更改我的Apps脚本代码,因为Google+登录功能已被弃用?

使用 Google Apps 脚本在 Blogger 中创建帖子

无法使用访问令牌访问部署为网络应用程序的 Google Apps 脚本

例外:未配置访问 - API 更新后使用 Google Apps 脚本的 BigQuery

如何使用 Gmail API、OAuth2 for Apps 脚本和域范围委派为 G Suite 域中的用户设置电子邮件签名