如何让 PHP 访问给定的普通用户驱动器而不请求 OAUTH2 凭据?

问题描述 投票:0回答:1

我愿意通过 FlySystem 管理 Google Drive 文件夹。我通过官方客户端库找到了大量有关通过 PHP 访问 Google Drive 的信息。

但我发现只有 2 个场景我可以看到,我需要第三个场景:

场景a:每个用户都表明自己的身份

  • 如果我使用OAUTH2系统,则应该会提示用户登录屏幕,然后图书馆就可以访问他们的文件(您需要配置重定向URL等)。

场景b:访问“服务帐户”

  • 如果我使用服务帐户,程序将访问以空驱动器开头且没有用户友好的 UI 的“服务帐户”的文件。

想要的场景

  • 我们目前有一些标准用户,例如
    [email protected]
    ,该用户仅由办公室老板管理。
  • 老板通过 google-drive 网络界面上传可供员工使用的文件。目前
    [email protected]
    有一个与所有员工共享的文件夹。
  • 但是我们希望对文件上传进行一些自动化,但其他一些文件上传仍然是手动的。
  • 我们不希望每个员工都能访问
    [email protected]
    凭证。
  • 我希望 PHP 管理
    [email protected]
    中的该文件夹。

我所看到的:

  • 在场景 A 中,我应该向员工提供
    [email protected]
  • 的密码
  • 在场景 B 中,我不知道如何让老板访问 -比如说 -
    [email protected]
    通过标准驱动器 Web-UI 轻松查看所有文件。

问题

  • 如何让 PHP 访问给定的常规 google 帐户(不是服务帐户)中的文件,始终是同一帐户,而不向用户提供该帐户的密码?

PD:我的最终目标是使用flysystem的驱动,虽然问题与flysystem本身没有直接关系,但驱动访问。

php google-cloud-platform permissions google-drive-api flysystem-google-drive
1个回答
-1
投票

找到了。

TL;博士

长话短说,这不是关于拥有服务帐户。这是关于在“离线模式”下使用 OAuth2。

使用 OAuth2,而不是服务帐户

这就是窍门:

  • 在正常的 OAuth2 流程中,用户位于您的应用程序前面,请求访问,然后弹出一个屏幕进行授权,然后用户被重定向回您的应用程序。授予短期访问令牌。
  • 在离线流程中,您手动执行一次弹出过程来授权,但随后您请求一个长期刷新令牌,应用程序将使用该令牌在后台获取您的短期令牌。

步骤

这些是获取所需数据的步骤。

  1. 您创建应用程序。设定一个名字。获取 client_id 和 client_secret。
  2. 您配置 OAuth 屏幕。处于“开发模式”就可以了(无需公开验证)。
  3. 您创建一组凭证。这些将是 OAuth2 类型。
  4. 这里使用技巧:通过 google 访问此客户端模拟器 https://developers.google.com/oauthplayground
  5. 您可以在那里获取刷新令牌。

此处找到获取客户端 ID 和密钥的说明以及在此处获取 reresh 令牌

示例代码

这是我的示例代码,使用了所有这些内容,经过测试并允许从一个 gmail 帐户(包含应用程序)访问另一个不同的、固定始终相同的帐户(包含数据)。

在此示例中,我创建了一个由

League\Flysystem\Filesystem
驱动的标准跨驱动程序
Google\Client
对象,其配置方式使其可以从给定的特定 google 驱动器访问文件,而无需用户交互(后台/服务器使用)。

use Google\Client as GoogleClient;
use Google\Service\Drive;
use League\Flysystem\Config;
use League\Flysystem\Filesystem;
use League\Flysystem\Visibility;

// Define the class, etc. Next is a single method.
// Inject $this->googleClientConfig via configuration-injection.

private getGoogleDriveFilesystem() : Filesystem
{
    $config = [
        'client_id' => $this->googleClientConfig[ 'clientId' ],
        'client_secret' => $this->googleClientConfig[ 'clientSecret' ],
        'application_name' => 'My Nice App Sandbox FlySystem Test',
    ];

    // This consumes the standard PHP Google Client.
    $googleClient = new GoogleClient( $config );

    // This is the key to skip the user-interaction.
    $googleClient->fetchAccessTokenWithRefreshToken( $this->googleClientConfig[ 'userRefreshToken' ] );

    $drive = new Drive( $googleClient );
    $adapter = new GoogleDriveAdapter(
        $drive,
        $this->googleClientConfig[ 'userRootFolder' ],
    );
    $filesystem = new Filesystem( $adapter, [ Config::OPTION_VISIBILITY => Visibility::PRIVATE ] );
    return $filesystem;
}
© www.soinside.com 2019 - 2024. All rights reserved.