-2

I've been using Spreadsheets and upwork, as I want to integrate between them.

So I'm trying to make authorization for upwork through spreadsheets, using the documentation steps and everything is going fine. But when i authorize my account i see that the response_type is not a token, it's a code.

 function authorize() {
 return OAuth2.createService('upwork')

      // Set the endpoint URLs, which are the same for all Google services.
      .setAuthorizationBaseUrl('https://www.upwork.com/ab/account-security/oauth2/authorize')
      .setTokenUrl('https://www.upwork.com/ab/account-security/oauth2/token')

      // Set the client ID and secret, from the Google Developers Console.
      .setClientId('cleintID')
      .setClientSecret('clientSecret')
      .setRedirectUri('https://script.google.com/macros/d/{Script-ID}/usercallback') 
 
      .setTokenFormat(OAuth2.TOKEN_FORMAT.FORM_URL_ENCODED)
      
      // Set the name of the callback function in the script referenced
      // above that should be invoked to complete the OAuth flow.
      .setCallbackFunction('authCallback')

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getUserProperties())
}

So this is my first question, Is there is a way to set the response_type to token, as i am setting in the picture above the clientID,redirectUri... (I tried setResponseType but it doesn't exist)

although working as it's and using response_type=code, after authorization the a request should be returned to the

function as below function authCallback(request) {
  var driveService = authorize();
  Logger.log(request) //this is always null
  var isAuthorized = driveService.handleCallback(request);
  if (isAuthorized) {
    Logger.log('Yaaay')
    return HtmlService.createHtmlOutput('Success! You can close this tab.');
  } else {
    Logger.log('Naaay')
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  }
}

authorize() is not called ??

Finally below is the whole code i'm using.

function authorize() {
 return OAuth2.createService('upwork')

      // Set the endpoint URLs, which are the same for all Google services.
      .setAuthorizationBaseUrl('https://www.upwork.com/ab/account-security/oauth2/authorize')
      .setTokenUrl('https://www.upwork.com/ab/account-security/oauth2/token')

      // Set the client ID and secret, from the Google Developers Console.
      .setClientId('cleintID')
      .setClientSecret('clientSecret')
      .setRedirectUri('https://script.google.com/macros/d/{Script-ID}/usercallback') 
 
      .setTokenFormat(OAuth2.TOKEN_FORMAT.FORM_URL_ENCODED)
      
      // Set the name of the callback function in the script referenced
      // above that should be invoked to complete the OAuth flow.
      .setCallbackFunction('authCallback')

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getUserProperties())
}

function redirect() {
  var driveService = authorize();
  if (!driveService.hasAccess()) {
    var authorizationUrl = driveService.getAuthorizationUrl();
    var template = HtmlService.createTemplate(
        '<a href="<?= authorizationUrl ?>" target="_blank">Press here to authroze</a>.');
    template.authorizationUrl = authorizationUrl;
    var page = template.evaluate().setTitle('Authroize');
    SpreadsheetApp.getUi().showSidebar(page);
  }
}

function authCallback(request) {
  var driveService = authorize();
  Logger.log(request)
  var isAuthorized = driveService.handleCallback(request);
  if (isAuthorized) {
    Logger.log('Yaaay')
    return HtmlService.createHtmlOutput('Success! You can close this tab.');
  } else {
    Logger.log('Naaay')
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  }
}

Update: I found that redirectURI is incorrect format, as google require the URI to be in the form of https://script.google.com/macros/d/{SCRIPT ID}/usercallback, so now the error changes and i got a failure

    Error: Error retrieving token: 404: {"<!DOCTYPE html>\n<html lang":"\"en\">\n<head>\n\n <meta name","":"undefined"," window.performance.mark 

":"undefined"," window.performance.mark(name);\n }\n\n function remove_mark(name) {\n window.performance ":"undefined"," window.performance.clearMarks ":"undefined"," window.performance.clearMarks(name);\n }\n\n function 

create_measure(name, startMark, endMark) {\n window.performance ":"undefined"," window.performance.measure ":"undefined"," window.performance.measure(name, startMark, endMark);\n }\n\n function remove_measure(name) {\n window.performance ":"undefined"," window.performance.clearMeasures ":"undefined"," window.performance.clearMeasures(name);\n }\n</script>\n <link 

rel":"\"stylesheet\" href","amp;site.application":"AccountSecurity","amp;site.version":"ed46c62af44692608c290dd0b498fa933b20c567","amp;site.environment":"prod","amp;server-error.status":"1",

"amp;server-error.label":"404+-+Agate","amp;server-error.traceId":"5c7d08790a6473b1-IAD\" height","l":"'+l:'';j.async","granted_time":1598271686} (line 541, file "Service")
17
  • With your reputation, you should know that images of code are not acceptable. See minimal reproducible example Commented Aug 19, 2020 at 20:55
  • 1
    Upwork api is oauth1 and not oauth2 Commented Aug 19, 2020 at 21:02
  • @TheMaster i appreciate your comments, but they have produced beta version of oauth2 for upwork, developers.upwork.com/?lang=node#authentication-beta_oauth-20 , and i would appreciate if you have example for authentication whether to any of them, as i found struggle in understanding them. Commented Aug 23, 2020 at 14:27
  • Implicit grant responseType=token is explicitly mentioned as incompatible with the library. request parameter is always NULL and i can't find out why ?? It'll run only on auth flow- not manually. PS: Avoid pictures of code. Show your code in text. Commented Aug 23, 2020 at 16:17
  • @TheMaster It'll run only on auth flow- not manually. would you explain this please. Commented Aug 23, 2020 at 16:42

1 Answer 1

0
.setTokenUrl('https://www.upwork.com/ab/account-security/oauth2/token')

According to documentation, tokenurl should be

POST /api/v3/oauth2/token

Use:

.setTokenUrl('https://www.upwork.com/api/v3/oauth2/token')

406 is due to incorrect or no Accept headers. This header is set due to

.setTokenFormat(OAuth2.TOKEN_FORMAT.FORM_URL_ENCODED)

Remove it to use default accept headers:

//.setTokenFormat(OAuth2.TOKEN_FORMAT.FORM_URL_ENCODED)
Sign up to request clarification or add additional context in comments.

3 Comments

This generated a new Error : Error retrieving token: 406: {"{\"message\":\"HTTP 406 Not Acceptable\"}":"undefined","granted_time":1598544244} (line 541, file "Service")
@Doom Edited my answer.
Man, thank you very much, it works. Really i appreciate your help.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.