Как загрузить на YouTube v3 с помощью токена доступа?

Я прошел через OAuth в веб-приложении и получил токен доступа...

Теперь я полагаю, что должен использовать этот токен доступа для загрузки видео, но API v3, похоже, не позволяет мне его использовать. Я просматриваю API данных YouTube: примеры кода .NET. В частности, мне кажется странной эта строка:

UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets,
                new[] { "YouTubeService.Scope.YoutubeUpload" },
                "user",
                CancellationToken.None);

Третий параметр user, я думаю, это имя пользователя. Я не получаю эту информацию из ответа OAuth2. Я даже не знаю, что такое имя пользователя YouTube — я вижу только отображаемые имена, когда просматриваю профили людей на YouTube, и эти отображаемые имена НЕ уникальны. Что это за третий параметр?

Имя функции AuthorizeAsync подразумевает, что нам еще предстоит получить авторизацию, но тогда зачем вообще использовать OAuth? Наличие токена доступа ко мне означает, что пользователь уже разрешил загрузку нашего приложения.

Я также нашел эту возможность передать токен доступа:

var token = new TokenResponse() 
            { 
                AccessToken = "xm239jjks9f98900....."
            };

            UserCredential credential = new UserCredential(new GoogleAuthorizationCodeFlow(
                new GoogleAuthorizationCodeFlow.Initializer 
                { 
                    ClientSecrets = secrets
                }
                ), "userId", token);

            //GoogleAuthorizationCodeFlow
            YouTubeService youTubeService = new YouTubeService(new BaseClientService.Initializer() 
            { 
                HttpClientInitializer = credential,
                ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
            });

Просто по названию «TokenResponse» кажется, что я не должен создавать его явно. Кроме того, GoogleAuthorizationCodeFlow.Initializer имеет параметр для userId, какой выигрыш я не знаю, потому что OAuth2 не дал мне его.

У BaseClientService.Initializer() также есть ApplicationName, что это такое? Я не думаю, что это Assembly.GetExecutingAssembly().GetName().Name, так как я откуда-то скопировал.

Я попытался запустить приведенный выше код и получаю сообщение об ошибке «Срок действия токена доступа истек, но мы не можем его обновить», но пользователь только что вошел в систему в течение последних нескольких секунд, поэтому токен доступа является новым.

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


ОБНОВИТЬ:

В моем случае весь код находится внутри пользовательской функции веб-API, но я думаю, что он будет работать одинаково на любой серверной странице (.aspx.cs) или контроллере MVC.

Я обнаружил, что мы ДЕЙСТВИТЕЛЬНО сохраняем буквальную строку «пользователь» независимо от того, кто может войти в свою учетную запись Google. Я предполагаю, что внутренняя работа UserCredential или GoogleWebAuthorizationBroker знает, как получить правильные данные, возможно, из файлов cookie (?), И функция UploadAsync будет знать, в какую учетную запись загрузить видео.

Я также использовал GoogleWebAuthorizationBroker вместо того, чтобы создавать UserCredential и Token с нуля (что привело к сообщению "expired token").

Теперь то, на что я, к счастью, наткнулся после отчаянных попыток что-либо, заключается в том, что мне нужно было настроить установленное приложение (собственное) типа «Другое», которое ОТДЕЛЬНО от веб-приложения. Это установленное приложение будет иметь свой собственный набор идентификатора клиента и секрета клиента. Используя эти учетные данные, загрузка сработала!

... Но есть вещи, которые совсем не то. Пользователю будет предложено снова аутентифицировать ваше клиентское приложение, но для этого согласия будет открыта новая вкладка, и когда вы нажмете «Принять» (или «ОК»), вы попадете на пустую страницу с надписью «код доступа получен». . Ваша загрузка действительно произошла, но это очень грязная и неприемлемая проблема с пользовательским интерфейсом.

Я все еще не удовлетворен, так как то, что я думаю, что я сделал, является хакерским/неправильным.


person Mickael Caruso    schedule 07.04.2015    source источник
comment
Я сделал тот же код, чтобы загрузить видео в свою учетную запись. И он также открывает браузер, чтобы получить мое разрешение на взаимодействие приложения с моей учетной записью. Для меня это имеет смысл — вы не хотите, чтобы приложение получало доступ к вашей учетной записи без вашего разрешения — правильно?   -  person Mike Weber    schedule 08.04.2015
comment
Правильный. Существует согласие на то, что пользователь должен согласиться войти в ваше веб-приложение (на стороне клиента) в первую очередь (для управления учетной записью YouTube и данными Google+). Но когда они нажимают кнопку «Загрузить» в первый раз, им предоставляется окно разрешения на доступ в автономном режиме для серверного приложения, которое будет выполнять загрузку — все это хорошо, но формулировка «автономный доступ», вероятно, напугает большинство пользователей.   -  person Mickael Caruso    schedule 08.04.2015
comment
Дело в том, что я не могу использовать чисто клиентскую загрузку, потому что я не прошу пользователя взять файл со своего компьютера для загрузки на YouTube. Я разрешаю им загрузить файл, который уже был сохранен где-то в Интернете и принадлежит им.   -  person Mickael Caruso    schedule 08.04.2015
comment
developers.google.com/ youtube/v3/руководства/   -  person Ramratan Gupta    schedule 04.11.2016


Ответы (1)


Я столкнулся именно с этой проблемой. Изучив код, я обнаружил, что проблему можно обойти, установив свойства Issued и ExpiresInSeconds в TokenResponse:

token.Issued = DateTime.Now;
token.ExpiresInSeconds = int.MaxValue;

Это хак, но он работает как шарм! Похоже, что авторы клиента .net предполагали, что у вас всегда будет токен обновления, поскольку они затрудняют использование только токена доступа. Библиотеки java и python в этом отношении гораздо более интуитивно понятны.

Кажется, не имеет значения, что вы передаете для пользовательских строк.

person fickerra    schedule 08.07.2016