2

В конечном счете, я пытаюсь загрузить видео на YouTube от имени пользователя, который разрешил мой сайт/приложение сделать это.Как настроить веб-сайт, для которого авторизация для учетных данных YouTube используется консольным приложением?

У меня есть сайт, на котором пользователь разрешает сайту использовать учетные данные пользователя YouTube. Затем веб-сайт правильно сохраняет учетные данные после авторизации пользователя (API данных YouTube версии 3). Проблема в том, что эти учетные данные желательны для использования серверным процессом, который для всех целей будет рассматриваться как консольное приложение.

Однако при добавлении учетных данных в мой проект в Менеджере API Google я могу либо сделать веб-браузер, и веб-сервер (и другие), либо «другой пользовательский интерфейс (Windows)». Но я не могу делать ОБА. Я считаю, что мне нужны оба, потому что пользователь авторизуется через веб-сайт, но консольный процесс использует учетные данные.

Но даже если у меня есть ответ на это выше, как передать учетные данные USER в консольное приложение, используя пример кода, который они показывают в образцах?

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».

Решение один:

Определить пользователей по-разному, так что вы знаете, что вы загружаете меня против вас. Просто изменив параметр «пользователь», он загрузит требуемый или попросит пользователя выполнить аутентификацию, если он не сможет его найти.

Решение два:

По умолчанию библиотека использует FileDataStore, поэтому я его в шахте, и вы не имеете его в вашей. Если вы сохраняете учетные данные, то где-то еще скажите токен обновления в базе данных вместе с информацией о пользователе. Вы можете создать свою собственную реализацию IDataStore, которая будет загружать учетные данные оттуда.

Моя статья о FileDataStore может помочь вам понять, что она делает.Google .NET – FileDataStore demystified жаль, что у меня не было времени на создание статьи о создании реализации IDataStore, однако у меня может быть пример или две прокладки вокруг действительно зависит от того, где вы храните эти учетные данные.

+0

Ваше решение именно то, что я искал , однако, кто-нибудь еще считает это архаичным и ограничивающим? Заставляя создавать папки и файлы на основе пользователей? ** Есть ли способ вызвать все эти вещи вручную, собрав сообщения, формы и параметры? ** – LosDude

+0

В вашем примере из вашей ссылки я не вижу метода, с помощью которого вы можете получить необходимые ключи через базу данных. У вас есть такой пример? – LosDude

+0

Как я уже сказал, вы можете создать свою собственную реализацию iDatastore и загрузить ее из любого места. У меня есть версия, которая хранит все это в базе данных, например. – DaImTo