如何配置一个网站,该网站对 YouTube 凭据进行身份验证以供控制台应用程序使用?

Posted

技术标签:

【中文标题】如何配置一个网站,该网站对 YouTube 凭据进行身份验证以供控制台应用程序使用?【英文标题】:How to configure a Website that auth's for YouTube credentials to be used by console application? 【发布时间】:2017-03-16 14:59:33 【问题描述】:

最终,我正试图代表已授权我的网站/应用程序上传 YouTube 视频的用户上传。

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

但是,当在 Google API Manager 上向我的项目添加凭据时,我可以使用 Web 浏览器、Web 服务器(和其他)或“其他 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 文件系统的某个位置以供稍后检索,例如缓存。但我已经将这些“授权”值存储在数据库中,并希望检索它们并代表该用户采取行动。

我希望这是有道理的,如果它漫无目的,我深表歉意。

【问题讨论】:

【参考方案1】:

背景:

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

示例:

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,这就是为什么我有它而你没有它的原因。如果您将凭据存储在其他地方,请说出数据库中的刷新令牌以及您的用户信息。您可以创建自己的 IDataStore 实现,它将从那里加载凭据。

我关于 FileDataStore 的文章可能会帮助您了解它的作用。 Google .NET – FileDataStore demystified 抱歉,我还没有时间撰写有关创建 IDataStore 实现的文章,但是我可能有一两个示例,这取决于您将这些凭据存储在哪里

【讨论】:

您的解决方案正是我一直在寻找的,但是,有没有其他人认为这是过时和限制性的?强制需要根据用户创建文件夹和文件? 有没有办法通过组装帖子、表单和参数来手动调用所有这些东西? 在您的链接示例中,我没有看到可以通过数据库获取必要密钥的方法。你有这样的例子吗? 就像我说的,您可以创建自己的 iDatastore 实现并从任何地方加载它。例如,我有一个将其全部存储在数据库中的版本。 github.com/LindaLawton/Google-Dotnet-Samples/tree/master/… 里面有一个 db 是旧代码对不起我真的需要做一个更好的例子 谢谢!最后一个问题 - 在 Google API Manager 上向我的项目添加凭据时,我可以使用 Web 浏览器、Web 服务器(和其他)或“其他 UI (Windows)”。虽然用户将通过网站“授权”,但控制台应用程序将使用凭据。那么我应该在 Google Dashboard 中设置哪一个?网络?申请?

以上是关于如何配置一个网站,该网站对 YouTube 凭据进行身份验证以供控制台应用程序使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 youtube 频道嵌入网站?

如何将 Windows 身份验证凭据从客户端传递到 Web API 服务

如何在 youtube 等 Facebook 上分享我网站上的视频

我应该如何为想要嵌入自己的 Youtube 链接的其他人建立网站?

如何在爬网程序中安全地使用用户输入的凭据?

如何确定用户是不是订阅了 youtube 频道