当前位置: 首页 > 知识库问答 >
问题:

无需用户交互的Google Drive API身份验证

东门航
2023-03-14

我正在寻找一个谷歌驱动器API认证方案,将给予服务应用程序(服务器上)在驱动器文件夹中创建共享文档的权利,而无需用户交互。

谷歌目前对我应该使用的特定身份验证方案的唯一名称可能是这个问题的足够答案。

虽然文档创建将发生在响应用户的行动,这些文档将不会永久地与这些用户相关联,我不希望要求任何用户提供谷歌帐户。相反,我希望用户能够在文档创建后,通过web页面上显示的“任何有链接的人都可以编辑”类型的URL访问文档。

这是为了自动生成文档供多个通常匿名的人协作,所有文档都将存储在一个文件夹中。

很有可能这是这个问题的重复:谷歌驱动器API、用户名+密码认证。不幸的是,这个被接受的答案并没有包含足够的信息让我找到我的路,因为它引用的链接已经死了。

它也可能是其他已经接受但答案不明确的问题的重复,例如:.NET Google Docs API身份验证(没有用户交互),我如何在没有用户交互的情况下身份验证Google Calendar API v3,以及在没有用户交互的情况下驱动服务器上传API文档。

共有1个答案

羊舌庆
2023-03-14

作为服务帐户进行身份验证是我所需要的方法。

谷歌SDK的行动只是误导。当我提供了一些不正确的值时,它又回到了基于用户的身份验证(自动打开web浏览器请求交互式凭据)。我错误地将其解释为服务帐户功能被实现为由特定交互用户批准并在特定交互用户上下文中的长期密钥,或者类似的东西。

不需要用户交互,但是需要.p12证书,而不需要default.json文件提供的任何凭据(我已经通过多种方式尝试使用了这种凭据)。下面是我使用的代码:

using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v2;
using Google.Apis.Drive.v2.Data;
using Google.Apis.Http;
using Google.Apis.Services;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

using GData = Google.Apis.Drive.v2.Data;

public class Drive
{
    private const string GoogleDocMimeType = "application/vnd.google-apps.document";

    /// <summary>
    /// Creates a drive service, authenticated using information found in the Google Developers Console under "APIs & auth / Credentials / OAuth / Service account"
    /// </summary>
    /// <param name="svcEmail">The service account "Email address"</param>
    /// <param name="certPath">The path to the service account "P12 key" file</param>
    public Drive(string svcEmail, string certPath)
    {
        Service = AuthenticateService(svcEmail, certPath);
    }

    private DriveService Service
    {
        get;
        set;
    }

    /// <summary>
    /// Creates a "Google Doc" and shares it with anyone with the link
    /// </summary>
    /// <param name="title"></param>
    /// <returns>The drive FileId, accessible at https://docs.google.com/document/d/FileId </returns>
    public async Task<string> CreateShared(string title)
    {
        var fileId = await CreateDocument(title);
        await ShareFile(fileId);
        return fileId;
    }

    private async Task<string> CreateDocument(string title)
    {
        var file = new GData.File
        {
            Title = title,
            MimeType = GoogleDocMimeType
        };
        file = await Service.Files.Insert(file).ExecuteAsync();
        return file.Id;
    }

    private async Task ShareFile(string fileId)
    {
        Permission permission = new Permission
        {
            Type = "anyone",
            Role = "writer",
            WithLink = true
        };
        var a = Service.Permissions.Insert(permission, fileId);
        await a.ExecuteAsync();
    }

    private static DriveService AuthenticateService(string svcEmail, string certPath)
    {
        string[] scopes = new[] { DriveService.Scope.DriveFile };
        X509Certificate2 certificate = new X509Certificate2(certPath, "notasecret", X509KeyStorageFlags.Exportable);

        var init = new ServiceAccountCredential.Initializer(svcEmail) { Scopes = scopes };
        IConfigurableHttpClientInitializer credential = new ServiceAccountCredential(init.FromCertificate(certificate));

        return new DriveService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "Document Management Service",
        });
    }
}

这是一个实验性的消费者:

internal class Program
{
    private const string svcEmail = "serviceaccountid@developer.gserviceaccount.com";
    private const string certPath = @"credentials\projectname-fingerprintprefix.p12";
    private readonly static Drive drive = new Drive(svcEmail, certPath);

    private static void Main(string[] args)
    {
        string id = drive.CreateShared("my title").Result;
        Console.WriteLine(id);
    }
}

这似乎是在一个孤立的、特定于应用程序/项目的数据存储库中使用Google Drive存储。根据其他帖子,没有办法得到一个交互式驱动器UI视图。我不知道它是否使用了我的个人存储配额等。但是,这是迄今为止我所拥有的最好的方法,接下来我将为自己(不在这里)回答这些问题。

 类似资料:
  • 但SFTP在Filezilla中工作: 当尝试使用而不是通过对象创建SFTP客户端时,我得到了同样的错误。创建传输对象时也尝试添加,但没有帮助。 对此有什么想法吗?

  • 问题内容: 我在尝试使用Paramiko(Python)创建SFTP客户端时遇到了困难。 码: 错误: 打印运输对象显示: Paramiko日志文件: 但是SFTP可在FileZilla中使用: 当尝试使用而不是通过对象创建SFTP客户端时,出现了相同的错误。在创建我的传输对象时也尝试添加,没有帮助。 请问对此有何想法? 问题答案: 您的服务器正在使用键盘交互式身份验证,而不是简单的密码身份验证。

  • 我希望能够将spring社交链接与应用程序令牌一起使用,就像我可以使用spring社交脸书的变通方法一样(在spring社交面书中使用应用程序访问令牌来查询公共页面)。 我的应用程序只需要查询公共页面,所以不需要针对特定用户进行身份验证:例如,我会查询http://www.linkedin.com/company/google公司的公共页面 我已经阅读了很多留档,但我对目前的情况有点困惑。我认为你

  • 在不限制客户端证书的情况下,TLS中的相互身份验证有什么用? 以下是我对使用TLS的客户端/相互身份验证的理解。 现在rfc5246表示如下 这不会实现任何身份验证正确吗?例如,如果我有一个服务器信任由世界各地受信任的CA签署的任何证书,那么为什么还要费心于客户端身份验证呢?

  • 于是我在这里看到:https://firebase . Google . com/docs/auth/web/account-linking # link-auth-provider-credentials-to-a-user-account现在可以在Firebase中链接用户账号了。我还看到Firebase提供了匿名认证的功能,它为一个用户创建一个用户会话,不需要任何凭证。 在我们的应用程序中,

  • 问题内容: 是否存在node.js的现有用户身份验证库?特别是,我正在寻找可以对用户进行密码身份验证的东西(使用自定义后端身份验证数据库),并将该用户与会话相关联。 在编写身份验证库之前,我认为我会看看人们是否知道现有的库。通过Google搜索找不到任何明显的内容。 -Shreyas 问题答案: 看起来连接中间件的connect-auth插件正是我所需要的:http : //wiki.github