1
votes

I'm having some trouble configuring my Google Apps Script to properly handle the token that comes from the API I'm reaching out to. Everything from what I can tell is compatible.

I am using the Apps Script oAuth2 here.

When I run the below scripts I am able to get to the oAuth screen where i validate on the app, and when it passes the credentials back to google scripts on usercallback i get the below error.

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

My oAuth Script is below:

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');
  }
}

My Google Sheets script is below

// 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()
    }
  });
  // ...
}
1
Upon deeper investigation on this, it seems that the problem is on my fault. I mixed the URLs for client/server side auth. app.youneedabudget.com/oauth/token? - this is the correct token URL. - Colton Shaw

1 Answers

0
votes

Upon deeper investigation on this, it seems that the problem is on my fault. I mixed the URLs for client/server side auth.

https://app.youneedabudget.com/oauth/token? - this is the correct token URL.