web-dev-qa-db-ja.com

GoogleWebAuthorizationBroker.AuthorizeAsyncがハングする

私たちのウェブサイトは、コードビハインド(asp.net mvcアプリケーション)からビデオをYouTubeにアップロードする必要があります。 Googleの資格情報を取得しようとしていますが、AuthorizeAsyncを呼び出すと、アプリケーションがハングします。私は解決策を探し回ってみましたが、どれも役に立たないようです。私はすでに明白なグーグルとスタックオーバーフローを検索しました。ほとんどの場合、アプリケーションがappdataフォルダーにアクセスできない可能性があると述べたので、フォルダーをcドライブ、dドライブ、および実際のinetpubの場所に変更しました。テストしたところ、アプリケーションにそれらの場所への書き込みを実行できました。

具体的には、ユーザーが管理者で、顧客が動画をアップロードして、管理者が承認します。管理者が承認すると、YouTubeアカウントに投稿されます。管理者は何もする必要はありませんが、承認ボタンをクリックします。

これを実際の質問にするには、AuthorizeAsyncを回避するにはどうすればよいですか?さらに情報が必要な場合はお知らせください

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

これに合格する方法を見つけました。

代わりにGoogleAuthorizationCodeFlowを使用しました。これは次のようになります。

        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"
        });
24
iedoc

AuthorizeAsyncメソッドにはCancellationTokenが実装されているため、タイムアウトを使用するなどして、これが発生する可能性があります。

  • TokenSourceを作成して、トークン自体を取得します。
  • TokenSourceのキャンセルを20秒に設定します
  • 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.
}

20秒後、AuthorizeAsyncnotになったときに、このメソッドの呼び出し元RunAsyncが例外を受け取ります。

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

この行により、YouTube.Auth.Store/xxxにアクセストークンが生成されます。右クリックする必要がありますこのファイル->プロパティ->出力ディレクトリにコピー->常にコピービジュアルスタジオ

わたしにはできる。

0
Steven Chou