wpf 如果用户关闭浏览器窗口,如何从Google OAuth API获得结果?

soat7uwm  于 2022-12-30  发布在  Go
关注(0)|答案(4)|浏览(144)

我创建了一个使用Google API Client Library for .NET的WPF应用程序。按照这个示例,我编写了下面的代码:

var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            Secrets,
            new[] { "https://www.googleapis.com/auth/contacts.readonly" },
            "user",
            CancellationToken.None,
            new FileDataStore(TokenStorageName)).Result;

调用 AuthorizeAsync 方法将打开新的浏览器窗口/选项卡,其中包含登录表单。如果用户只是关闭浏览器窗口或选项卡,则会出现问题。我从未获得此调用的结果。
我能知道怎么处理这种情况吗?
我应该更改AuthorizeAsync(...)的源代码吗?

dced5bon

dced5bon1#

我解决这个问题的唯一方法是像DalmTo建议的那样添加一个超时周期,这并不理想,但我还没有找到解决这个问题的其他方法。
为此,我使用了以下代码:

'/ Create a new threading task /'
            Dim objTask As Task(Of Google.Apis.Auth.OAuth2.UserCredential)

            '/ Call google auth process /'
            objTask = GoogleWebAuthorizationBroker.AuthorizeAsync(objSecrets, mobjScopes, "user", CancellationToken.None, objFileStore)

            '/ Wait 2 minutes for a response /'
            objTask.Wait(240000)

            '/ If time out period expired status will still be Waiting for Activation /'
            If objTask.Status <> Tasks.TaskStatus.WaitingForActivation Then
                '/ Return user credentials /'
                Return objTask.Result
            End If
yk9xbfzb

yk9xbfzb2#

这是客户端库中的一个错误。No time out on GoogleWebAuthorizationBroker.AuthorizeAsync?当前唯一的选项是自己创建超时。

mzmfm0qo

mzmfm0qo3#

参见GoogleWebAuthorizationBroker.AuthorizeAsync() hangs if browser closed
一般情况下,无法检测到用户关闭浏览器标签/窗口。使用cancellationToken当前不起作用,#968已提交修复。

bxpogfeg

bxpogfeg4#

我偶然发现了这个线索。这是我的解决方案:

Stopwatch Tijd = new Stopwatch(); 
            UserCredential UserCredentials = null;
            Tijd.Start();
            Task<UserCredential> OAuthResponse = GoogleWebAuthorizationBroker.AuthorizeAsync(GSecrets.Secrets, Scopes, "user", CancellationToken.None, new FileDataStore("Google AanmeldToken", true));
            while (OAuthResponse.Status == TaskStatus.WaitingForActivation && Tijd.ElapsedMilliseconds > 30000) ; // wait for login or 30s time-out
            if (OAuthResponse.Status == TaskStatus.WaitingForActivation) // timed-out after 30s
                return "";
            Tijd.Stop();

(this是以字符串形式返回用户名的一段代码。)

相关问题