C# 如何限制api中的访问令牌使用

C# 如何限制api中的访问令牌使用,c#,google-api,google-drive-api,google-oauth,google-api-dotnet-client,C#,Google Api,Google Drive Api,Google Oauth,Google Api Dotnet Client,我使用谷歌硬盘作为存储设备。一个GD中有许多文件。此GD包含多个用户的文件。当某个用户想要访问他的文件时,我会为特定的文件生成访问令牌。但是,此访问令牌可用于列出GD上的所有文件,包括其他文件。我想在Google Drive上限制files.list API。有没有办法禁用files.list API? 我使用以下代码获取文件只读访问的刷新令牌 public static async Task<string> generateReaderRefreshToken(string cl

我使用谷歌硬盘作为存储设备。一个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;
    }
公共静态异步任务生成器ReaderRefreshToken(字符串clientID,字符串clientSecret)
{ 
字符串[]范围=新字符串[]{DriveService.Scope.DriveReadonly};
ClientSecrets=新的ClientSecrets
{
ClientId=ClientId,
ClientSecret=ClientSecret
};
UserCredential crdls=等待GoogleWebAuthorizationBroker.AuthorizationAsync
(秘密,
范围,
“用户”,
取消令牌(无);
返回crdls.Token.RefreshToken;
}

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

有效的谷歌驱动器作用域

Oauth2用户帐户 现在让我们假设您正在使用一个普通的oauth客户端,并使用一个刷新令牌来创建这些访问令牌。当您编写应用程序并显示一个同意屏幕时,我假设您请求了以下范围的访问

https://www.googleapis.com/auth/drive  See, edit, create, and delete all of your Google Drive files
https://www.googleapis.com/auth/drive.file  View and manage Google Drive files and folders that you have opened or created with this app
此作用域使您可以完全访问驱动器帐户。它不限制你有多少访问权限,你可以看到一切,做任何事情。当然,在驱动器api的限制范围内。它不会让你煮咖啡

oauth2服务帐户 现在让我们假设您正在使用一个服务帐户。服务帐户受与普通用户相同的规则约束。当您验证服务帐户时。您可能还使用了,这样服务帐户就可以控制其所有文件。当服务帐户创建访问令牌时,这些访问令牌仍然可以访问驱动器帐户上的所有文件

驱动器文件作用域 还有一个范围对您有帮助,但没有您希望的那么多,即以下范围

https://www.googleapis.com/auth/drive  See, edit, create, and delete all of your Google Drive files
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表示,或者更确切地说是由您在google开发者控制台上创建的项目表示。因此,使用此作用域,您将只能访问此应用程序创建的文件,而不能访问其他应用程序创建的文件

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

访问令牌就像密钥一样,只要它们是有效的,它们就可以做任何允许它们访问的事情

你的密码。 创建应用程序的方式是,您有一个控制台应用程序,运行一次该应用程序可以向您返回一个刷新令牌,该令牌授予对“google驱动器帐户”的读取权限。然后,您将使用此刷新令牌创建新的访问令牌,以允许其他人访问您的帐户。问题是,你给了他们这个账户上的所有信息。你不能对他们隐瞒任何事情,他们有完全的权限

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

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

  • 您可能会发现我关于服务帐户的文章很有趣,我还有一个关于.net服务帐户的例子,您可能会发现它很有用

    如果您与每个用户共享他应该访问的文件,然后让他以编程方式访问此文件,就像他自己一样?@ziganotschka,因为每个用户都应该拥有gmail,那该怎么办账户这不好。您还可以考虑使用一个服务帐户,该帐户只能读取/列出与服务acocut显式共享的文件。@ziganotschka在我的例子中,有一个应用程序生成读取/写入访问令牌,以查看或上载客户端应用程序的文件。我对服务账户了解不多,但它能解决我的问题吗?@DaImTo我编辑过。该代码用于生成刷新令牌,该令牌随后用于生成只读访问令牌。有几个问题。假设我有一个应用程序(使用谷歌控制台创建)和10个用户GD帐户。我的应用程序可以访问所有10个用户的GD文件。如果我创建服务帐户,它应该在我的应用程序帐户上(与我创建应用程序的谷歌帐户相同)。那么,此服务帐户是否使用10个用户的驱动器来存储/读取文件?服务帐户仅用于访问开发人员有权访问的帐户。如果你需要访问用户的google drive帐户,那么你需要使用Oauth2并请求访问他们的帐户。服务帐户似乎对我没有帮助。不,你不能以编程方式创建他们。我不知道限制是什么,但可以与多少用户共享一个文件夹是有限制的。