0

Я пытаюсь загрузить видео на мой счет YouTube с помощью следующего кода в моем ActionResult в моем asp.net MVC проекта:ASP.net MVC: Доступ к Google GoogleWebAuthorizationBroker возвращается ошибка доступа

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Upload([Bind(Include = " Title, Description")] HttpPostedFileBase uploadFile, Videos videos) 
    { 
var credential = AuthYouTube(); 
YouTubeService youtubeService = new YouTubeService(new 

YouTubeService.Initializer() 
       { 
        ApplicationName = "app-name", 
        HttpClientInitializer = credential 
       }); 

// Do Stuff with the video here. 
}} 

AuthYouTube() выглядит следующим образом (тот же контроллер):

public UserCredential AuthYouTube() 
    { 
     string filePath = Server.MapPath("~/Content/YT/client_secret.json"); 
     UserCredential credential; 
     try{ 

      using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
      { 
       credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets, 
        // This OAuth 2.0 access scope allows for full read/write access to the 
        // authenticated user's account. 
        new[] { YouTubeService.Scope.Youtube }, 
        "[email protected]", 
        CancellationToken.None, 
        new FileDataStore(Server.MapPath("~/Content/YT"),true) 
       ).Result; 
      }; 
      return credential; 
     } 
     catch(EvaluateException ex) 
     { 
      Console.WriteLine(ex.InnerException); 
      return null; 
     } 

    } 

Я сохранил свою client_secret.json, что я скачал из консоли Google Developer внутри [проект]/содержания/YT. (Также попробовал в папке/App_Data

При загрузке отладчика отображается сообщение folowwing:.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ComponentModel.Win32Exception: Access is denied 

Место, где встретилась ошибка:

credential = GoogleWebAuthorizationBroker.AuthorizeAsync(

StackStrace:

[Win32Exception (0x80004005): Access is denied] 
    Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +115 
    Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) +78 
    Google.Apis.Auth.OAuth2.<AuthorizeAsync>d__1.MoveNext() in C:\Users\mdril\Documents\GitHub\google-api-dotnet-client\Src\GoogleApis.Auth.DotNet4\OAuth2\GoogleWebAuthorizationBroker.cs:59 

[AggregateException: One or more errors occurred.] 
    System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) +4472256 
    Project.Controllers.VideosController.AuthYouTube() in d:\dev\Development\project\project\Controllers\VideosController.cs:133 
    project.Controllers.VideosController.Upload(HttpPostedFileBase uploadFile, Videos videos) in d:\dev\project\project\Controllers\VideosController.cs:71 

В чем причина этого? - Google API? - папка/права IIS?

Update 01-02-2016

Может быть, какая-то ошибка доступа на стороне API? Если нет, может кто-нибудь, пожалуйста, предоставьте мне шаги, необходимые для прав IIS, все равно получите сообщение об ошибке после предоставления прав доступа к папке.

Выполнение следующего кода. Создайте папку как предназначено внутри моего App_Data, но также возвращает ту же ошибку «Доступ запрещен». Папка пуста.

 var path = HttpContext.Current.Server.MapPath("~/App_Data/Drive.Api.Auth.Store"); 

     // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% 
     UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret } 
                        , scopes 
                        , userName 
                        , CancellationToken.None 
                        , new FileDataStore(path,true)).Result; 

Не могли бы вы объяснить, как это работает?

+0

добавьте проверку, что он может найти файл filePath и получить к нему доступ. – DaImTo

+0

@dalmo Сделал это allready. Происходит путь filepath (stream). Больше действий? – RunnicFusion

+0

убедитесь, что у вас есть доступ к записи в этот каталог. звучит для меня как filedatastore can not create file. Предоставьте права администратора пользователю IIS. – DaImTo

ответ

3

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

Как я это сделал: https://developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web-applications-aspnet-mvc

Создание контроллера обратного вызова:

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(); } 
     } 
    } 
} 

Создать класс и заполнить в полномочиях:

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.YouTube.v3; 
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[] { YouTubeService.Scope.YoutubeUpload }, 
        DataStore = new FileDataStore(HttpContext.Current.Server.MapPath("~/App_Data/clientsecret.json")), 
       }); 

     public override string AuthCallback 
     { 
      get { return @"/AuthCallback/Upload"; } 
     } 

     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; } 
     } 
    } 
} 

В моей ActionResult Я установил YoutubeService.творящий мое видео происходят внутри моего Upload POST

Вашего собственного контроллер (шахта для действий в/загрузке):

public async Task<ActionResult> Upload(CancellationToken cancellationToken) 
     { 
      var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).AuthorizeAsync(cancellationToken); 
      if (result.Credential != null) 
      { 
       var youtubeService = new YouTubeService(new BaseClientService.Initializer 
       { 
        HttpClientInitializer = result.Credential, 
        ApplicationName = "name", 
       }); 
       return View(); 
      } 
      else 
      { 
       return new RedirectResult(result.RedirectUri); 
      }   
     } 

Для загрузки логики см:https://developers.google.com/youtube/v3/code_samples/dotnet#upload_a_video

Установить URL-адрес переадресации в консоли Google для разработчиков

В консоли разработчика Google набор Авторизованный перенаправлять значение URI, чтобы что-то вроде (мой контроллер называется видео): http://www.domainname.com/Videos/Upload

** Использование одного OAuth счета **

InstEd спасения идентификатор клиента (GUID , см. GetUserId внутри файла AppFlowMetadata) внутри моей сессии. Теперь я использую один единственный идентификатор, чтобы использовать тот же токен/отзыв для всех пользователей.