【问题标题】:Trouble accessing a googlesheet using API created by someone else and only shared to specific persons无法使用由其他人创建且仅与特定人员共享的 API 访问 googlesheet
【发布时间】:2019-12-18 18:30:48
【问题描述】:

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

现在,我使用 Google Developer Console 来设置 Googlesheets API 库。我在这里添加了一个简单的表单:https://alcocovers.com/knowledge-base/track-your-order/。当我第一次使用该表格时,我点击了“登录”按钮(当前隐藏),它在弹出窗口中向我显示了同意书,我使用我的 Google ID 登录并询问“alcocovers.com 想要访问我的个人资料信息”,我提供了访问权限。表格开始工作,我可以从表格中提取信息并显示在我们的网页上。

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

下面是我用来初始化和验证客户端的代码。此代码是从 Google Sheet API 文档中复制粘贴的。我假设这需要更改,因此 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 密钥,只是更改了 CLIENT ID。

【问题讨论】:

    标签: javascript browser google-sheets-api


    【解决方案1】:

    其他用户无法使用您的凭据访问工作表。为此,您需要使用Service Account。创建后,您可以使用您的 Google 帐户通过 Domain-Wide Delegation 使用服务帐户凭据而不是您的凭据对 API 进行授权调用。按照文档中的步骤操作:

    1 - 创建服务帐户和凭据

    1. 打开Service accounts page。如果出现提示,请选择一个项目。
    2. 单击添加创建服务帐户,输入名称和描述 服务帐户。您可以使用默认服务帐号 ID,或者 选择一个不同的,独特的。完成后点击创建。
    3. 随后的服务帐户权限(可选)部分是 不需要。点击继续。
    4. 在授予用户对此服务帐户的访问权限屏幕上,滚动 向下到创建密钥部分。点击添加创建密钥。
    5. 在出现的侧面板中,为您的密钥选择格式:JSON 推荐。
    6. 单击创建。您的新公钥/私钥对已生成,并且 下载到您的机器上;它是该密钥的唯一副本。 有关如何安全存储的信息,请参阅Managing service account keys
    7. 在保存到您计算机的私钥对话框中单击关闭,然后 点击完成以返回您的服务帐号表。

    2 - 启用 G Suite 域范围委派:

    1. 在表中找到新创建的服务帐户。在下面 操作,点击显示更多,然后点击编辑。
    2. 在服务帐户详细信息中,单击显示域范围 委派,然后确保启用 G Suite 域范围委派 复选框已选中。
    3. 如果您尚未配置应用的 OAuth 同意屏幕,您可以 必须这样做才能启用域范围委派。跟着 屏幕上的说明来配置 OAuth 同意屏幕,然后 重复上述步骤并重新勾选复选框。
    4. 点击保存更新服务账号,返回表 服务帐户。可以看到一个新列,域范围的委派。 点击查看客户 ID,获取并记下客户 ID。

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

    【讨论】:

    • 非常感谢您的详细回答。让我跟着你的向导。一切完成后,我将更新并接受。再次,非常感谢。
    • 我有一个问题:有没有使用服务帐户凭据通过 JavaScript 访问工作表的示例?我找不到它。从我在不同页面上看到的情况来看,由于安全问题,服务帐户与 javascript 不兼容。如果我必须使用服务帐户,我需要使用 php 或 nodejs。对吗?
    • 我不知道有关 Javascript 和服务帐户的任何安全问题。只需将旧凭据文件更改为 SA 文件,您就可以在代码中使用它。
    • 感谢您澄清这一点,我刚刚用浏览器控制台中看到的错误更新了我的问题。有任何想法吗?这可能是因为我没有在该项目的任何位置添加@alcocovers.com G-Suite 帐户吗?即使启用,“2 - 启用 G Suite 域范围委派:”实际上并没有工作?
    • 尝试将您的域添加到Javascript origins 授权。为此,请创建一个 Web 应用程序类型 ClientId 并将其设置在那里。如果这不起作用,我们可以在聊天室中继续对话,而不是延长 cmets。
    猜你喜欢
    • 2021-08-25
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多