WebAuthenticationBroker.AuthenticateAsync无法正常工作

时间:2013-03-27 18:37:02

标签: c# windows-8 windows-runtime oauth-2.0 winrt-async

我正在构建Windows 8应用程序,并且我正在尝试在应用程序启动时从Google数据API获取令牌。我构建了一个函数来执行此操作,它具有以下代码:

string authCodeUrl = UrlHelpers.BaseUrlFactory(UrlType.OAuth) +
                    "?client_id=" + _clientId +
                    "&redirect_uri=" + _redirectUri +
                    "&response_type=code" +
                    "&scope=" + _scope;

Uri startUri = new Uri(authCodeUrl);
Uri endUri = new Uri("https://accounts.google.com/o/oauth2/approval?");

WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.UseTitle, startUri, endUri);

我在调用OnLaunched()之前调用App.xaml.cs Window.Current.Activate()中的函数。我这样做的原因是因为我已经需要MainViewModel中的令牌。

奇怪的是:当我以正常方式(通过Visual Studio)启动我的应用程序时,它会停留在启动画面上(启动画面会持续很长时间),但是当我在此行上放置一个断点时:

WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.UseTitle, startUri, endUri);

并逐步完成它,我突然得到一个登录窗口,允许我登录并获取令牌,这意味着启动画面消失了,我可以使用我的应用程序。

当我从App.xaml.cs中删除调用并且只是从我的ViewModel请求令牌时,我遇到了同样的问题:它仍然停留在SplashScreen上。当我从App.xaml.cs请求令牌但在Window.Current.Activate()调用后移动请求时,我也遇到此问题。但在这些情况下,登录后闪屏会消失,但屏幕会保持黑屏。我没看到我的应用程序。

P.s。,这就是我从App.xaml.cs请求令牌的方式(OnLaunched被标记为async):

IOAuth2Service oAuth2Service = new OAuth2Service();
await oAuth2Service.GetToken();

OAuth2Service只是一个方法GetToken()的对象。这种方法正如我上面所描述的那样。

当我使用断点逐步浏览应用程序时,有没有人知道它为什么会起作用,但是当我在没有单步执行它的情况下启动它时却没有?

我已经解决了这个问题,并创建了一个仅包含此代码的Github项目。你可以在这里找到它:https://github.com/Avalaxy/OAuth2WinRT/tree/master/App1。有一个app.xaml.cs调用OAuth2.GetToken()。

1 个答案:

答案 0 :(得分:3)

根据documentation -

  

如果应用程序或其启动画面保留在屏幕上,则没有时间限制,但最终应用程序需要调用“激活”才能继续。

不可否认,有点模糊且需要解释,但在GetToken请求之前将呼叫移至激活状态会使您超越看似潜在的竞争条件。