Gmail加载项:未触发Oauth

时间:2019-03-28 10:57:34

标签: javascript google-apps-script oauth gmail gmail-addons

在下面的代码中,“测试”按钮触发一个函数,该函数调用外部端点以加载数据。但是,单击按钮时什么也没有发生,并且在控制台区域出现%时出现400错误。

Code.gs

Invalid Argument

authService.gs

function buildAddOn(e) {
  // Create a section for that contains all user Labels.
  var section = CardService.newCardSection()  
  var action = CardService.newAction()
        .setFunctionName("testCall");

  var button = CardService.newTextButton().setText('Test').setOnClickAction(action);
  section.addWidget(CardService.newButtonSet().addButton(button)); 

//  section.addWidget(CardService.newTextParagraph()
//    .setText("This is a text paragraph widget. Multiple lines are allowed if needed.");)

  // Build the main card after adding the section.
  var card = CardService.newCardBuilder()
    .setHeader(CardService.newCardHeader()
    .setTitle('Authentication Card')
    .setImageUrl('https://www.gstatic.com/images/icons/material/system/1x/label_googblue_48dp.png'))
    .addSection(section)
    .build();

  return [card];
}

function testCall(){
  console.log("test");
  var data = accessProtectedResource('https://api.ssdf.io/v1.0/asd/4/174203','get');
  return CardService.newActionResponseBuilder()
      .setNotification(CardService.newNotification()
          .setType(CardService.NotificationType.INFO)
          .setText(data))
      .build();
}

2 个答案:

答案 0 :(得分:1)

函数getOAuthService()中的所有URL必须是该示例的原始google-URL:

      // Set the endpoint URLs, which are the same for all Google services.
      .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
      .setTokenUrl('https://accounts.google.com/o/oauth2/token')

      // Set the scopes to request (space-separated for Google services).
      .setScope('https://www.googleapis.com/auth/drive')

也许可以更改后一个,但仅更改路径,而不更改域,并且您必须查看API是否以及如何调整。同样,该范围参数在您的示例中也有所不同,但是我不知道是否可以接受“ 1”。

如果授予访问权限,但不涉及验证身份验证,则您自己的应用程序会收到反馈。因此,您还需要获取访问令牌,我在您的代码var accessToken = service.getAccessToken();中看到了它,在示例中,它看起来有点不同:

function makeRequest() {
  var driveService = getDriveService();
  var response = UrlFetchApp.fetch('https://www.googleapis.com/drive/v2/files?maxResults=10', {
    headers: {
      Authorization: 'Bearer ' + driveService.getAccessToken()
    }
  });
  // ...
}

请参阅Authorization: 'Bearer ' + driveService.getAccessToken()所在的行。

未(也不应该)将您自己的服务器配置为处理身份验证请求,因此抛出400 error。该API构建为供客户端Javascript使用,因此建议不要在自己的服务器上使用它进行身份验证。不过,下面我列出了在您自己的服务器上使用的API。

使用您自己的服务器进行身份验证
如果您不建议使用google服务器进行身份验证,那么随着服务器配置(apache,nginx等)和服务器端编程语言(PHP,Python, ...)。

然后,您必须调试标头,将什么准确发送到服务器以及服务器为什么无法处理标头。您可以在浏览器的开发人员工具(网络面板)中调试请求和响应,并检查服务器的错误文件。

服务器必须自己获取Google服务,并且如果您遵循example you linked in your code,则只能执行JavaScript进行的前端操作。

在此示例中,进行了三个服务器请求:
-一个进行身份验证
-一个获得身份验证令牌的人
-获得受保护服务的人
您必须记住,然后必须由您自己的服务器完成所有三个步骤,并且您的服务器必须能够对所有三种请求类型进行回答。
一个重要的问题可能是三个请求中的哪个正在产生错误?

您应该扩展您的问题,然后再发现与服务器通信有关的详细问题。

服务器端OAuth身份验证的API和示例
PHP:https://developers.google.com/api-client-library/php/auth/web-app
Python:https://developers.google.com/api-client-library/python/auth/web-app
Ruby:https://developers.google.com/api-client-library/ruby/auth/web-app
NodeJ:https://developers.google.com/apps-script/api/quickstart/nodejs
Java:https://developers.google.com/api-client-library/java/google-oauth-java-client/
前往:https://github.com/googleapis/google-api-go-client
.NET:https://developers.google.com/api-client-library/dotnet/apis/oauth2/v2

答案 1 :(得分:0)

400错误代码似乎表明链接错误,我认为您需要检查不同的URL。 特别是在getOAuthService中,您在授权基本URL中写了:“ https://apP.ss.io/oauth/authorize”,在令牌URL中写了“ https://apI.ss.io/oauth/token”。