繁体   English   中英

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

[英]How to restrict access token usage with in an api

我使用 Google Drive 作为存储。 一个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;
    }

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

有效的谷歌驱动范围

在此处输入图像描述

Oauth2 用户帐户

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

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

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

oauth2 服务帐号

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

驱动文件 scope

还有另外一个 scope 对您有帮助,但不如您希望的那么大

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

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

应答器

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

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

你的代码。

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

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

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

您可能会发现我关于服务帐户的文章很有趣Google 开发人员控制台服务帐户我还有一个带有 .net 的服务帐户示例,您可能会发现有用的ServiceAccount.cs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM