Я предполагаю, что вы используете клиентскую библиотеку .net API Google.Существует несколько типов клиентов с веб-клиентом входа в систему Google и клиентом собственных приложений.
Код, используемый для аутентификации двух приложений, различается.Когда вы авторизуетесь с помощью собственного клиента, вы запускаете веб-браузер на локальном компьютере.Если веб-приложение размещено на веб-сайте, браузер должен быть открыт на клиентском компьютере пользователя.
Ошибка, которую вы видите здесь, обычно происходит потому, что вы ее размещаете и пытаетесь открыть веб-браузер на самом сервере, а не в клинике пользователей.Вы должны следовать этому руководству web-application-aspnet-mvc
Добавить собственную реализацию FlowMetadata.
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's 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; }
}
}
}
FlowMetadata - абстрактный класс, содержащий вашу собственную логикудля получения идентификатора пользователя и используемого вами IAuthorizationCodeFlow.
В приведенном выше примере кода создается новый GoogleAuthorizationCodeFlow с нужными областями, секретами клиента и хранилищем данных.Попробуйте добавить собственную реализацию IDataStore, например, вы можете написать такую, которая использует EntityFramework.
Реализуйте свой собственный контроллер, который использует службу API Google.В следующем примере используется DriveService:
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Mvc;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Services;
using Google.Apis.Sample.MVC4;
namespace Google.Apis.Sample.MVC4.Controllers
{
public class HomeController : Controller
{
public async Task IndexAsync(CancellationToken cancellationToken)
{
var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
AuthorizeAsync(cancellationToken);
if (result.Credential != null)
{
var service = new DriveService(new BaseClientService.Initializer
{
HttpClientInitializer = result.Credential,
ApplicationName = "ASP.NET MVC Sample"
});
// YOUR CODE SHOULD BE HERE..
// SAMPLE CODE:
var list = await service.Files.List().ExecuteAsync();
ViewBag.Message = "FILE COUNT IS: " + list.Items.Count();
return View();
}
else
{
return new RedirectResult(result.RedirectUri);
}
}
}
}
Реализация собственного контроллера обратного вызова.Реализация должна выглядеть примерно так:
using Google.Apis.Sample.MVC4;
namespace Google.Apis.Sample.MVC4.Controllers
{
public class AuthCallbackController : Google.Apis.Auth.OAuth2.Mvc.Controllers.AuthCallbackController
{
protected override Google.Apis.Auth.OAuth2.Mvc.FlowMetadata FlowData
{
get { return new AppFlowMetadata(); }
}
}
}
Вам нужно будет изменить пример с google drive на Youtube.