Я прошел через 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").
Теперь то, на что я, к счастью, наткнулся после отчаянных попыток что-либо, заключается в том, что мне нужно было настроить установленное приложение (собственное) типа «Другое», которое ОТДЕЛЬНО от веб-приложения. Это установленное приложение будет иметь свой собственный набор идентификатора клиента и секрета клиента. Используя эти учетные данные, загрузка сработала!
... Но есть вещи, которые совсем не то. Пользователю будет предложено снова аутентифицировать ваше клиентское приложение, но для этого согласия будет открыта новая вкладка, и когда вы нажмете «Принять» (или «ОК»), вы попадете на пустую страницу с надписью «код доступа получен». . Ваша загрузка действительно произошла, но это очень грязная и неприемлемая проблема с пользовательским интерфейсом.
Я все еще не удовлетворен, так как то, что я думаю, что я сделал, является хакерским/неправильным.