Подтвердить что ты не робот

Создание службы YouTube через ASP.NET с использованием уже существующего маркера доступа

Я работаю над веб-сайтом, чтобы пользователи могли загружать видео в общую учетную запись YouTube для последующего доступа. После большой работы я смог получить активный токен и жизнеспособный токен обновления.

Однако код для инициализации объекта YouTubeService выглядит следующим образом:

UserCredential credential;
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 YouTube channel, but doesn't allow other types of access.
        new[] { YouTubeService.Scope.YoutubeUpload },
        "user",
        CancellationToken.None
    );
}

var youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = Assembly.GetExecutingAssembly().GetName().Name,
});

У меня уже есть токен, и я хочу использовать мой. Я использую ASP.NET версии 3.5, и поэтому я не могу делать вызов async в любом случае.

Можно ли создать объект YouTubeService без вызова async и использовать мой собственный токен? Есть ли способ создать объект учетных данных без авторизационного брокера?

В качестве альтернативы, приложение использовало YouTube API V2 в течение довольно долгого времени и имело форму, в которой был введен токен, и сделал почтовую операцию против URI YouTube, который был создан вместе с токеном в API V2. Есть ли способ реализовать это с помощью V3? Есть ли способ использовать Javascript для загрузки видео и, возможно, пример, который я мог бы использовать в своем коде?

4b9b3361

Ответ 1

ПРИМЕЧАНИЕ. Я закончил обновление моей платформы до 4.5 для доступа к библиотекам google.

Чтобы запрограммировать инициализацию объекта UserCredential, вам необходимо создать поток и токенResponse. Поток требует области действия (ака разрешения, которые мы запрашиваем для учетных данных.

using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Responses;
using Google.Apis.Auth.OAuth2.Flows;

string[] scopes = new string[] {
    YouTubeService.Scope.Youtube,
    YouTubeService.Scope.YoutubeUpload
};

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = XXXXXXXXXX,  <- Put your own values here
        ClientSecret = XXXXXXXXXX  <- Put your own values here
    },
    Scopes = scopes,
    DataStore = new FileDataStore("Store")
});

TokenResponse token = new TokenResponse {
    AccessToken = lblActiveToken.Text,
    RefreshToken = lblRefreshToken.Text
};

UserCredential credential = new UserCredential(flow, Environment.UserName, token);

Надеюсь, что это поможет.

Ответ 2

В настоящее время официальная клиентская библиотека Google.NET не работает с .NET Framework 3.5. (Примечание: это старый вопрос, который библиотека не поддерживала .NET 3.5 с 2014 года. Таким образом, утверждение также было бы корректным.) Сказав, что вы не сможете создать службу для Google.NET с использованием существующего токена доступа. Также невозможно создать его с помощью токена доступа с использованием любой .NET Framework, вам необходимо создать собственную реализацию Idatastore и загрузить токен обновления.

Поддерживаемые платформы

  • .NET Framework 4.5 и 4.6
  • .NET Core (через поддержку netstandard1.3)
  • Приложения для Windows 8
  • Windows Phone 8 и 8.1
  • Портативные библиотеки классов

Сказав это, вам придется с самого начала кодировать это самостоятельно. Я сделал это, и это выполнимо.

Аутентификация:

Вы заявили, что у вас уже есть токен обновления, поэтому я не буду вникать в его создание. Ниже приведен вызов HTTP POST

Обновить запрос токена доступа:

https://accounts.google.com/o/oauth2/token 
client_id={ClientId}.apps.googleusercontent.com&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token

Обновить ответ маркера доступа:

{ "access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ", "token_type" : "Bearer", "expires_in" : 3600 }

Вызов в API YouTube вы можете либо добавить токен доступа в качестве токена на предъявителя авторизации, либо просто довести его до конца любого запроса.

https://www.googleapis.com/youtube/v3/search?access_token={token here}

У меня есть полный пост по всем вызовам на сервере auth Google 3-х нотный поток Oauth2. Я просто использую обычные webRequets для всех моих вызовов.

// Create a request for the URL.
WebRequest request = WebRequest.Create("http://www.contoso.com/default.html");  
// If required by the server, set the credentials.  
request.Credentials = CredentialCache.DefaultCredentials;  
// Get the response.
WebResponse response = request.GetResponse();  
// Display the status.
Console.WriteLine (((HttpWebResponse)response).StatusDescription);  
// Get the stream containing content returned by the server.  
Stream dataStream = response.GetResponseStream();  
// Open the stream using a StreamReader for easy access.  
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
// Display the content.  
Console.WriteLine(responseFromServer);  
// Clean up the streams and the response.  
reader.Close();  
response.Close();

Обновление .NET 4 +

Если вы можете перейти на новую версию .NET с помощью библиотеки, это будет намного проще. Это из официальной документации Googles Веб-приложения ASP.NET. У меня есть еще один пример кода на моей учетной записи github, который обучает использованию API Google Диска. Google dotnet использует данные YouTube v3.

using System;
using System.Web.Mvc;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Util.Store;

namespace Google.Apis.Sample.MVC4
{
    public class AppFlowMetadata : FlowMetadata
    {
        private static readonly IAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
                {
                    ClientSecrets = new ClientSecrets
                    {
                        ClientId = "PUT_CLIENT_ID_HERE",
                        ClientSecret = "PUT_CLIENT_SECRET_HERE"
                    },
                    Scopes = new[] { DriveService.Scope.Drive },
                    DataStore = new FileDataStore("Drive.Api.Auth.Store")
                });

        public override string GetUserId(Controller controller)
        {
            // In this sample we use the session to store the user identifiers.
            // That not the best practice, because you should have a logic to identify
            // a user. You might want to use "OpenID Connect".
            // You can read more about the protocol in the following link:
            // https://developers.google.com/accounts/docs/OAuth2Login.
            var user = controller.Session["user"];
            if (user == null)
            {
                user = Guid.NewGuid();
                controller.Session["user"] = user;
            }
            return user.ToString();

        }

        public override IAuthorizationCodeFlow Flow
        {
            get { return flow; }
        }
    }
}

Наверху YouTube не поддерживает учетные записи служб, которые вам придется придерживаться с Oauth2. Пока вы аутентифицировали свой код, как только он должен продолжать работать.