Google电子表格API请求的身份验证范围不足

时间:2016-07-22 20:29:48

标签: node.js google-api google-spreadsheet-api

我正在制作一个脚本,使用nodejs上的以下脚本从谷歌电子表格中读取数据:

Office.context.document.settings.refreshAsync(function (asyncResult) {
    var taskpaneVal = asyncResult.value.get("backgroundColor");
});

但是在每次获取请求时我都会收到此错误:

var url = oauth2Client.generateAuthUrl({
    access_type:     'offline',
    approval_prompt: 'force',
    scope: [
      'https://www.googleapis.com/auth/analytics.readonly',
      'https://www.googleapis.com/auth/drive',
      'https://www.googleapis.com/auth/spreadsheets'
    ]
});
global.googleapis = { expiry_date: 0 };
google.options({ auth: oauth2Client });
var sheets    = google.sheets('v4');
sheets.spreadsheets.get({ spreadsheetId: 'id'}, function(err, data) {
    res.send(err, data);
});

我查看了Google开发者控制台以启用Google Drive API并启用了它,所以我真的不知道它会是什么。

10 个答案:

答案 0 :(得分:30)

  1. 首先删除凭据文件~/.credentials/sheets.googleapis.com-nodejs-quickstart.json(取决于您的设置)

  2. 更改用于从Google电子表格中读取单元格的范围变量

  3.   

    var SCOPES =   [ 'https://www.googleapis.com/auth/spreadsheets.readonly'];

      

    var SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];

    1. 执行代码后,API将再次进行身份验证,然后问题将得到解决。

答案 1 :(得分:19)

范围看起来不错,也许您应该尝试删除先前存储在/Users/yourUserName/.credentials/sheets.googleapis.com-projectName/*中的凭据,然后再次执行应用程序以获取新凭据。

答案 2 :(得分:5)

首先,请确保您还在开发者控制台中启用了表格API

insufficient authentication scopes是请求中提供的OAuth 2.0令牌中的错误,指定scopes不足以访问请求的数据。

因此,请确保使用正确且所有必要的范围,如果您正确执行此处的步骤,请检查此Authorizing requests with OAuth 2.0

最后,尝试撤消访问权限并尝试重做它。

有关详细信息,请查看此相关的SO问题:

答案 3 :(得分:0)

更新范围时发生了相同的问题。连同说明一起,我使用python脚本删除了同一目录下的token.json文件,然后身份验证范围问题就消失了。

答案 4 :(得分:0)

我一直在寻找凭证位置。很多论坛都提到它将在c:\ users \ .credentials \ google-api ****。json下,但我在任何地方都找不到它们。然后我发现我的程序在 program .py 目录中创建了一个 token.pickle 文件,该文件本质上是凭证文件。

答案 5 :(得分:0)

在我的情况下,在与程序相同的工作目录中创建了token.pickle文件,我的凭据.json文件也位于同一目录中,我所做的全部是删除了token.pickle文件,然后更改了范围,然后再次运行它,它将再次要求您在浏览器中进行身份验证,就可以了。

我的代码段如下所示,我正在创建一个pickle文件,因此必须在更改范围之前将其删除

    if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

答案 6 :(得分:0)

从令牌文件夹中删除令牌,然后重试。如果您尝试在运行电子表格快速入门之前先运行Google云端硬盘快速入门,则现有令牌可能未更新电子表格访问权限。

答案 7 :(得分:0)

还请检查工作区中googleapis的安装版本,因为最新版本(51)不支持Node8。因此,您需要降级其版本。 https://github.com/googleapis/google-api-nodejs-client/releases

答案 8 :(得分:0)

如@herrogokunaruto所述,确保工作空间文件夹中不存在token.pickle文件

答案 9 :(得分:0)

就我而言(Java + IntellijIdea),我删除了一个文件:~/IdeaProjects/projectName/tokens/StoredCredential 并重新启动了代码。

这个文件夹是用 GoogleAuthorizationCodeFlow.Builder 创建的,所以可能不同,但文件应该是一样的。

重新启动后,我再次切换到 Quickstart 页面进行访问管理 - 为用户提供所有访问权限并关注。

在那之后,一切对我来说都很好