Javascript 使用其他人创建的API访问googlesheet时遇到问题,该API仅共享给特定的人

Javascript 使用其他人创建的API访问googlesheet时遇到问题,该API仅共享给特定的人,javascript,browser,google-sheets-api,Javascript,Browser,Google Sheets Api,我们的供应商维护一个谷歌表单,我们正在尝试在我们的网站上添加一个表单,用于访问该表单并从中提取数据。非常简单的任务,但是我们在OAuth上遇到了问题。该表不是公开的,只与某些人共享(包括我的谷歌ID) 现在,我使用GoogleDeveloper控制台来设置Googlesheets API库。我在这里添加了一个简单的表单:。当我第一次使用表单时,我点击“登录”按钮(当前隐藏),它在弹出窗口中显示同意书,我使用谷歌ID登录,它询问“alcovers.com想要访问我的个人资料信息”,我允许访问。表单

我们的供应商维护一个谷歌表单,我们正在尝试在我们的网站上添加一个表单,用于访问该表单并从中提取数据。非常简单的任务,但是我们在OAuth上遇到了问题。该表不是公开的,只与某些人共享(包括我的谷歌ID)

现在,我使用GoogleDeveloper控制台来设置Googlesheets API库。我在这里添加了一个简单的表单:。当我第一次使用表单时,我点击“登录”按钮(当前隐藏),它在弹出窗口中显示同意书,我使用谷歌ID登录,它询问“alcovers.com想要访问我的个人资料信息”,我允许访问。表单开始工作,我可以从表单中提取信息并显示在我们的网页上

但问题是,我链接网站以访问我的谷歌账户(和谷歌表单)的身份验证并不适用于所有人。如果我在匿名模式下使用表单,它将无法访问表单,这意味着使用表单的每个人都必须给予同意。这没有意义,因为我认为当我第一次登录并让网站访问我的帐户和工作表时,它对每个人都有效。这是一个网站,使访问不是个人用户。我们希望我们网站的用户能够使用表单并从表单中提取数据。我怎样才能做到这一点

下面是我用来初始化和验证客户端的代码。此代码是从GoogleSheetAPI文档复制粘贴的。我假设这需要改变,所以OAuth只发生一次,这是已经完成的,将站点链接到表单,在将来使用表单时,不需要同意

function initClient() {
    var API_KEY = '';  // I added api key here

    var CLIENT_ID = ''; // I added client id here  

    var SCOPE = 'https://www.googleapis.com/auth/spreadsheets.readonly';

    gapi.client.init({
        'apiKey': API_KEY,
        'clientId': CLIENT_ID,
        'scope': SCOPE,
        'discoveryDocs': ['https://sheets.googleapis.com/$discovery/rest?version=v4'],
    }).then(function() {
        gapi.auth2.getAuthInstance().isSignedIn.listen(updateSignInStatus);
        updateSignInStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
    });
}


function handleClientLoad() {
    gapi.load('client:auth2', initClient);
}

function updateSignInStatus(isSignedIn) {
    if (isSignedIn) {
        makeApiCall();
    }
}

function handleSignInClick(event) {
    gapi.auth2.getAuthInstance().signIn();
}

function handleSignOutClick(event) {
    gapi.auth2.getAuthInstance().signOut();
}
更新#1: 在尝试了@Jescanellas建议的解决方案之后,我发现了以下错误。注意,我保留了相同的API密钥,只更改了客户端ID。

其他用户无法使用您的凭据访问工作表。为了做到这一点,你需要使用一个。一旦您创建了它,您就可以使用您的Google帐户对API进行授权调用,方法是使用服务帐户凭据而不是您的凭据。按照文档中的步骤操作:

1-创建服务帐户和凭据

  • 打开门。如果出现提示,请选择一个项目
  • 单击添加创建服务帐户,输入帐户的名称和说明 服务帐户。您可以使用默认的服务帐户ID,或 选择一个不同的,独特的。完成后,单击创建
  • 下面的服务帐户权限(可选)部分是 不需要。单击“继续”
  • 在授予用户访问此服务帐户的权限屏幕上,滚动 下至“创建关键点”部分。单击添加创建密钥
  • 在出现的侧面板中,选择密钥的格式:JSON 建议使用
  • 单击创建。将生成新的公钥/私钥对,并 下载到您的机器上;它是此密钥的唯一副本。 有关如何安全存储的信息,请参阅
  • 单击保存到计算机的私钥对话框上的关闭,然后单击 单击“完成”返回服务帐户表
  • 2-要启用G套件域范围的委派:

  • 在表中找到新创建的服务帐户。在下面 操作,单击“显示更多”,然后单击“编辑”
  • 在服务帐户详细信息中,单击显示域范围 委派,然后确保启用G套件域范围的委派 复选框已选中
  • 如果尚未配置应用程序的OAuth同意屏幕,则 必须这样做,才能启用域范围的委派。遵循 配置OAuth同意屏幕的屏幕说明,然后 重复上述步骤并重新选中复选框
  • 单击“保存”以更新服务帐户,并返回到列表 服务帐户。可以看到一个新的专栏,全域委托。 单击查看客户端ID,以获取并记录客户端ID

  • 如前所述,请使用服务帐户凭据访问该工作表。

    非常感谢您提供的详细答案。让我跟着你的向导走。我会更新和接受,一旦一切都完成了。再次感谢。我有一个问题:是否有一个使用服务帐户凭据使用JavaScript访问工作表的示例?我找不到它。从我在不同页面上看到的情况来看,由于安全问题,服务帐户与javascript不兼容。如果我必须使用服务帐户,我需要使用php或nodejs。对吗?我不知道Javascript和服务帐户有任何安全问题。您只需将旧凭据文件更改为SA文件,就可以将其与代码一起使用。感谢您的澄清,我刚刚用浏览器控制台中看到的错误更新了我的问题。有什么想法吗?这可能是因为我没有在该项目的任何地方添加@alcovers.com G-Suite帐户吗?即使启用了“2-启用G套件域范围的委派:”也不起作用?请尝试将您的域添加到授权中。为此,创建一个Web应用程序类型ClientId并将其设置在那里。如果这不起作用,我们可以在聊天室继续对话,不扩展评论。