如何配置一个网站,授权控制台应用程序使用 YouTube 凭据?

How to configure a Website that auth's for YouTube credentials to be used by console application?

最后,我尝试代表授权我的网站/应用程序的用户上传 YouTube 视频。

我有一个网站,用户授权该网站使用用户的 YouTube 凭据。然后,网站会在用户授权后正确存储凭据 (YouTube Data API v3)。问题是,这些凭据需要由服务器进程使用,出于所有目的将被视为控制台应用程序。

但是,当在 Google API 管理器上向我的项目添加凭据时,我可以使用 Web 浏览器、Web 服务器(和其他)或 "other UI (Windows)"。但我不能两者都做。我相信我需要两者,因为用户通过网站授权,但控制台进程使用凭据。

但即使我对上述问题有答案,我如何使用示例中显示的示例代码将用户凭据传递到控制台应用程序?

using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
        {
            credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                // This OAuth 2.0 access scope allows an application to upload files to the
                // authenticated user's YouTube channel, but doesn't allow other types of access.
                new[] { YouTubeService.Scope.YoutubeUpload },
                "user",
                CancellationToken.None
            );
        }

似乎这段代码更多地用于将凭据存储在 Windows 文件系统的某个位置,以便稍后检索,就像缓存一样。但我已经将这些 "authorized" 值存储在数据库中,并且想检索它们并代表该用户执行操作。

我希望这是有道理的,如果它乱七八糟,我深表歉意。

背景:

默认情况下,Google .NET 客户端库将用户的凭据存储在 %AppData% 您拥有的字段中 "user" 是它的存储方式。

示例:

UserCredential credential;
using (var stream = new FileStream(clientSecretsJsonFilePath
                                   ,FileMode.Open
                                   ,FileAccess.Read))
{   
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        new[] { DriveService.Scope.Drive,  DriveService.Scope.DriveFile },
        "LookIAmAUniqueUser",
        CancellationToken.None,
        new FileDataStore("Drive.Auth.Store")                               
    ).Result;
}

假设用户在身份验证请求屏幕上单击接受,将在该目录中创建一个具有以下结构的新文件:

Google.Apis.Auth.OAuth2.Responses.TokenResponse-LookIAmAUniqueUser.TokenResponse-LookIAmAUniqueUser

每个用户都有自己的文件,您可以通过更改 "LookIAmAUniqueUser" 值来更改用户。

解决方法一:

以不同的方式识别您的用户,这样您就知道您加载的是我还是您。只需更改 "user" 参数,它就会加载所需的,如果找不到则要求用户进行身份验证。

方案二:

默认情况下,库使用 FileDataStore that's why I have it in mine and you don't have it in yours. If you are storing the credentials someplace else say the refresh token in the database along with your user information. You can create your own implementation of IDataStore 将从那里加载凭据。

我关于 FileDataStore 的文章可能会帮助您了解它的作用。 Google .NET – FileDataStore demystified 抱歉,我没有时间写一篇关于创建 IDataStore 实现的文章,但是我可能会举一两个例子,这实际上取决于您存储这些凭据的位置