我的应用程序使用多个API,所有这些都在同一个auth init下成功-除了应用程序脚本执行API,它抛出错误代码401,并显示以下消息:"请求缺少所需的身份验证凭据。应为OAuth 2访问令牌、登录cookie或其他有效的身份验证凭证。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project.">
我使用的是相同的谷歌云项目id,应用程序脚本函数API可执行文件设置正确。发送电子邮件API和从驱动器API获取文件都非常有效。除了这个。我在本地主机上运行它们。
我将精简代码,只放大我认为可能是问题所在的最相关的部分。
<script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script>
<script>
window.onLoadCallback = function(){
gapi.load('auth2', initSigninV2);
};
function initSigninV2() {
gapi.auth2.init({
apiKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
discoveryDocs: ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest","https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest","https://script.googleapis.com/$discovery/rest?version=v1"],
clientId: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com',
scope: 'https://www.googleapis.com/auth/drive'+' https://www.googleapis.com/auth/gmail.send'+' https://www.googleapis.com/auth/script.scriptapp'
}).then(function (authInstance) {
if(!gapi.auth2.getAuthInstance().isSignedIn.get()) {
gapi.auth2.getAuthInstance().signIn();
}
// Listen for sign-in state changes.
gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);
// Handle the initial sign-in state.
updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
});
}
</script>
这就是失败的功能:
function appScript(callback, data, field, dl) {
var scriptId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var request = {
'function': 'doPost',
'parameters': {'data':JSON.stringify(data)}
};
var headers = getClientRequestHeaders();
console.log(headers);
gapi.client.request({
'root': 'https://script.googleapis.com',
'path': 'v1/scripts/' + scriptId + ':run',
'method': 'POST',
'headers': headers,
'body': request
}).then(function (response) {
console.log(response);
// callback(response.fileid, response.id, field);
// if (dl) {
// dl(response.fileid);
// }
});
}
我找到了解决方案:代码401正在返回,因为我没有正确的作用域,我进入谷歌应用程序脚本>文件>属性>作用域,看看我真正需要的作用域是什么,结果发现我缺少一个作用域。
我加了这个,一切都很顺利。