webentwicklung-frage-antwort-db.com.de

GoogleWebAuthorizationBroker.AuthorizeAsync hängt

Unsere Website muss Videos aus dem Code dahinter hochladen (asp.net mvc-Anwendung). Ich versuche, die Google-Anmeldeinformationen abzurufen, aber wenn ich AuthorizeAsync anrufe, bleibt die Anwendung hängen. Ich habe überall nach einer Lösung gesucht und scheint nicht zu helfen. Ich habe bereits das Offensichtliche bei google und stack overflow gesucht. Das meiste von dem, was ich fand, erwähnte, dass die Anwendung möglicherweise keinen Zugriff auf den Ordner appdata hat. Daher habe ich versucht, den Ordner so zu ändern, dass er im Laufwerk c, im Laufwerk d und im tatsächlichen inetpub-Verzeichnis liegt. Ich habe getestet und festgestellt, dass ich die Anwendung an diesen Speicherorten schreiben konnte.

um genauer zu sein, ist der Benutzer unser Administrator, die Kunden laden Videos zu uns hoch und der Administrator genehmigt sie. Wenn der Administrator sie genehmigt, wird es in unserem Youtube-Konto veröffentlicht. Der Administrator sollte nichts weiter tun müssen, als auf die Schaltfläche zum Bestätigen zu klicken.

Was kann ich tun, um an AuthorizeAsync vorbeizukommen? Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen

        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

Ich habe einen Weg gefunden, um das zu passieren.

Ich habe stattdessen GoogleAuthorizationCodeFlow verwendet. So sah es aus:

        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

Wenn dies möglich ist, kann dies beispielsweise durch ein Timeout ausgelöst werden, da die Methode AuthorizeAsyncdie Implementierung eines CancellationTokenhat.

  • Erstellen Sie einen TokenSourcename__, um das Token selbst zu erhalten.
  • Legen Sie die Annullierung der TokenSource auf d. H. 20 Sekunden fest
  • Extrahieren Sie das Token, das an die Methode AuthorizeAsyncübergeben werden soll.

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

Nach 20 Sekunden, wenn der AuthorizeAsyncname__ nicht abgeschlossen war, erhält der Aufrufer dieser Methode RunAsynceine Exception.

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

Diese Zeile generiert ein Zugriffstoken in YouTube.Auth.Store/xxx, und Sie müssen mit der rechten Maustaste diese Datei -> Eigenschaften -> In Ausgabeverzeichnis kopieren -> Immer kopieren in Visual Studio kopieren

für mich geht das.

0
au.tw