web-dev-qa-db-fra.com

GoogleWebAuthorizationBroker.AuthorizeAsync se bloque

Notre site Web doit télécharger des vidéos sur youtube à partir du code situé derrière (application asp.net mvc). J'essaie d'obtenir les identifiants Google, mais lorsque j'appelle AuthorizeAsync, l'application se bloque. J'ai cherché partout une solution et aucun ne semble aider. J'ai déjà cherché l'évidence sur Google et le débordement de pile. la plupart de ce que j'ai trouvé mentionnait que l'application n'avait peut-être pas accès au dossier appdata. J'ai donc essayé de modifier le dossier afin qu'il se trouve dans le lecteur c, le lecteur d et l'emplacement inetpub actuel. J'ai testé et trouvé que je pouvais avoir l'application écrire à ces endroits.

pour être plus précis, l'utilisateur est notre administrateur, les clients nous envoient des vidéos et l'administrateur les approuve. quand l'administrateur les approuve, il est posté sur notre compte youtube. l'administrateur ne devrait rien faire d'autre que cliquer sur le bouton d'approbation.

Pour en faire une question réelle, que puis-je faire pour aller au-delà de AuthorizeAsync? Tenez-moi au courant si vous avez besoin de plus d'informations

        UserCredential credential;
        GoogleWebAuthorizationBroker.Folder = "YouTube.Auth.Store";
        using (var stream = new FileStream(CredentialsPath, FileMode.Open,
                             FileAccess.Read))
        {
            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                // This OAuth 2.0 access scope allows an application to upload files to the
                // authenticated user's YouTube channel, but doesn't allow other types of access.
                new[] { YouTubeService.Scope.YoutubeUpload },
                "user",
                CancellationToken.None,
                new FileDataStore("YouTube.Auth.Store")
            ).Result;
        }
11
iedoc

J'ai trouvé un moyen de passer ça.

J'ai utilisé GoogleAuthorizationCodeFlow à la place. Voici à quoi il ressemblait:

        ClientSecrets secrets = new ClientSecrets()
        {
            ClientId = CLIENT_ID,
            ClientSecret = CLIENT_SECRET
        };

        var token = new TokenResponse { RefreshToken = REFRESH_TOKEN }; 
        var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
            new GoogleAuthorizationCodeFlow.Initializer 
            {
                ClientSecrets = secrets
            }), 
            "user", 
            token);

        var service = new YouTubeService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credentials,
            ApplicationName = "TestProject"
        });
21
iedoc

Il est possible de le distinguer, par exemple en utilisant un délai d'expiration, car la méthode AuthorizeAsync a l'implémentation d'un CancellationToken.

  • Créez une TokenSource pour obtenir le jeton lui-même.
  • Définir l’annulation de TokenSource sur 20 secondes
  • Extrayez le jeton à transmettre à la méthode AuthorizeAsync.

public async void RunAsync()
{
    UserCredential credential;
    var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read);

    CancellationTokenSource cts = new CancellationTokenSource();
    cts.CancelAfter(TimeSpan.FromSeconds(20));
    CancellationToken ct = cts.Token;

    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
    GoogleClientSecrets.Load(stream).Secrets,
    new[] { YouTubeService.Scope.YoutubeUpload },
    "user",
    ct
    );

    if (ct.IsCancellationRequested) return;

    // do more stuff when came back authorized.
}

Maintenant, après 20 secondes, lorsque la AuthorizeAsync était non terminée, l'appelant de cette méthode RunAsync recevra une exception.

try
{
    await RunAsync();
}
catch(Exception)
{
     // "Timeout" of the RunAsync(); 
}
1
Markus Zeller
GoogleWebAuthorizationBroker.Folder = "YouTube.Auth.Store";

Cette ligne génère un jeton d'accès dans YouTube.Auth.Store/xxx. Vous devez cliquer avec le bouton droit de la souris sur ce fichier -> propriétés -> Copier dans le répertoire de sortie -> Copier toujours dans Visual Studio.

ça marche pour moi.

0
au.tw