在下面的代码中,“测试”按钮触发一个函数,该函数调用外部端点以加载数据。但是,单击按钮时什么也没有发生,并且在控制台区域出现%
时出现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();
}
答案 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”。