【问题标题】:How to restrict access token usage with in an api如何在 api 中限制访问令牌的使用
【发布时间】:2020-07-21 09:16:38
【问题描述】:

我使用 Google 云端硬盘作为存储设备。一个GD中有很多文件。此 GD 包含多个用户的文件。当某些用户想要访问他的文件时,我会为特定文件生成访问令牌。但是,此访问令牌可用于列出 GD 上的所有文件,包括其他文件。我想限制 Google Drive 上的 files.list API。有什么方法可以禁用 files.list API? 我使用以下代码获取刷新令牌以对文件进行只读访问

 public static async Task<string> generateReaderRefreshToken(string clientID, string clientSecret)
    { 
        string[] scopes = new string[] { DriveService.Scope.DriveReadonly  };

        ClientSecrets secrets = new ClientSecrets
        {
            ClientId = clientID,
            ClientSecret = clientSecret
        };
        UserCredential crdls = await GoogleWebAuthorizationBroker.AuthorizeAsync
         (secrets,
         scopes,
         "user",
         CancellationToken.None);
         
      
        return crdls.Token.RefreshToken;
    }

【问题讨论】:

  • 如果您与每个用户共享他应该有权访问的文件,然后让他以编程方式访问该文件并以自己的身份进行身份验证呢?
  • @ziganotschka 每个用户都应该有 gmail 帐户。这不好
  • 您也可以考虑使用只能读取/列出与服务帐户明确共享的文件的服务帐户。
  • @ziganotschka 在我的例子中,有一个应用程序可以生成读/写访问令牌来查看或上传客户端应用程序的文件。我对服务帐户不太了解,但它可以解决我的问题吗?
  • @DaImTo 我已编辑。该代码用于生成刷新令牌,后来用于生成只读访问令牌

标签: c# google-api google-drive-api google-oauth google-api-dotnet-client


【解决方案1】:

不幸的是,Oauth2 的工作方式大部分是在您获得访问权限时访问完整的驱动器帐户。除了 drive.file 之外,它可以让您访问由您的应用程序创建的所有文件。

有效的谷歌驱动范围

Oauth2 用户帐户

暂时假设您使用的是普通的 oauth 客户端,并使用刷新令牌来创建这些访问令牌。当您验证应用程序并显示同意屏幕时,我将假设您请求访问以下范围

https://www.googleapis.com/auth/drive  See, edit, create, and delete all of your Google Drive files

此范围使您可以完全访问驱动器帐户。它不限制您可以查看所有内容并执行任何操作的访问权限。当然在驱动 api 的范围内。它不会让你煮咖啡。

oauth2 服务帐号

现在假设您使用的是服务帐户。服务帐户受与普通用户相同的规则约束。当您对服务帐户进行身份验证时。您可能还使用了https://www.googleapis.com/auth/drive,这样服务帐户就可以控制其所有文件。当服务帐户创建访问令牌时,这些访问令牌仍然可以访问驱动器帐户上的所有文件

驱动文件范围

还有另一个范围可以帮助您,但没有您希望的那么大,是以下范围

https://www.googleapis.com/auth/drive.file  View and manage Google Drive files and folders that you have opened or created with this app

此范围将限制对您的应用程序创建的文件的访问。您的应用程序由客户端 ID 表示,或者更确切地说是您在谷歌开发者控制台上创建的项目。因此,使用此范围,您将只能访问由该应用程序创建的文件,而不能访问其他应用程序。

回答者

因此,虽然能够限制访问令牌授予访问权限的文件非常好,但不幸的是,除了将其限制为应用程序使用 drive.file 创建的所有文件外,这是不可能的。您也没有办法限制 API 可以使用访问令牌执行哪些方法。

访问令牌就像密钥,只要它们是有效的,它们就可以做任何有权限授予它们访问的事情。

您的代码。

您创建应用程序的方式是您有一个控制台应用程序,您运行一次会返回一个刷新令牌,该令牌授予对“谷歌驱动器帐户”的读取访问权限。然后,您将使用此刷新令牌创建新的访问令牌以允许其他人访问您的帐户。这样做的问题是,您让他们可以访问此帐户上的所有内容。你不能对他们隐藏任何东西,他们有完全的访问权限。

您应该考虑创建一个服务帐户。服务帐户是一个虚拟用户。它有自己的驱动器帐户。有两种方法可以使用服务帐号。

  1. 您可以将文件直接上传到服务帐户驱动帐户。然后使用服务帐户将文件提供给您的用户。因为它还可以从其帐户中读取数据。
  2. 您可以在当前使用的“otherDrive”帐户上创建一个目录,并与服务帐户共享它,就像与任何其他用户共享目录一样。然后,服务帐户将有权读取该目录,并且只有该目录才能将驱动器帐户的其余部分保密。

您可能会发现我关于服务帐户的文章很有趣Google Developer console service account我还有一个使用 .net 的服务帐户示例,您可能会觉得有用ServiceAccount.cs

【讨论】:

  • 有几个问题。假设我有一个应用程序(使用谷歌控制台创建)和 10 个用户 GD 帐户。我的应用程序可以访问所有 10 个用户的 GD 文件。如果我创建服务帐户,它应该在我的应用程序帐户上(在我创建应用程序的同一个谷歌帐户上)。那么,这个服务帐户是否使用 10 个用户驱动器来存储/读取文件?
  • 服务帐号仅用于访问开发者有权访问的帐号。如果您需要访问用户的 google drive 帐户,则需要使用 Oauth2 并请求访问他们的帐户。
  • 似乎服务帐户对我没有帮助。
  • 不,您不能以编程方式制作它们我不知道限制是什么,但您可以与多少用户共享文件夹会有限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 2015-01-02
  • 2021-09-29
  • 1970-01-01
  • 2020-10-08
  • 2023-02-02
  • 2018-07-29
相关资源
最近更新 更多