我正在为Windows Phone 8.1开发一个应用程序,它将使用Google Blogger Api。对于授权,我正在使用GoogleWebAuthorizationBroker.AuthorizeAsync((函数,一切都很好,我可以用我的博客做任何事情(获取博客/帖子列表,编辑,删除,添加帖子......
当我的应用程序首先打开时,它会调用GoogleWebAuthorizationBroker.AuthorizeAsync((函数,如果用户已经登录(先前经过身份验证和授权(,该函数将返回并重定向到我放置博客列表的起始页。这对我来说很好。
我的问题是:当用户未登录时,我想打开另一个页面("欢迎"页面(,在那里我将获得有关我的应用程序和登录按钮的一些基本信息。在这种情况下,当用户单击该按钮时,我只想调用GoogleWebAuthorizationBroker.AuthorizeAsync((函数,该函数会将我重定向到登录页面。但是我找不到方法来检查用户是否已经登录,并且仅在这种情况下显示"欢迎"页面。
以下是我如何使用GoogleWebAuthorizationBroker.AuthorizeAsync((函数。
m_credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = "my_client_id",
ClientSecret = "my_client_secret"
},
new[] { BloggerService.Scope.Blogger },
"user", CancellationToken.None);
我找到了问题的解决方案,并想在这里分享它对某人有所帮助。
Google API代码对所有人开放真是太好了,所以我可以深入研究GoogleWebAuthorizationBroker.AuthorizeAsync((函数,并看到它所做的所有步骤。这是我可以收集到一个函数中的所有步骤
private static async Task<UserCredential> AuthorizeAsync()
{
var initializer = new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = Constants.ClientId,
ClientSecret = Constants.ClientSecret
},
Scopes = new[] { BloggerService.Scope.Blogger },
DataStore = new StorageDataStore()
};
var flow = new AuthorizationCodeFlow(initializer);
var codeReceiver = new AuthorizationCodeBroker();
var token = await flow.LoadTokenAsync("user", CancellationToken.None).ConfigureAwait(false);
if (token == null || (token.RefreshToken == null && token.IsExpired(flow.Clock)))
{
var redirectUri = codeReceiver.RedirectUri;
AuthorizationCodeRequestUrl codeRequest = flow.CreateAuthorizationCodeRequest(redirectUri);
var response = await codeReceiver.ReceiveCodeAsync(codeRequest, CancellationToken.None).ConfigureAwait(false);
if (string.IsNullOrEmpty(response.Code))
{
var errorResponse = new TokenErrorResponse(response);
throw new TokenResponseException(errorResponse);
}
token = await flow.ExchangeCodeForTokenAsync("user", response.Code, codeReceiver.RedirectUri,
CancellationToken.None).ConfigureAwait(false);
}
m_credential = new UserCredential(flow, "user", token);
return m_credential;
}
从GoogleWebAuthorizationBroker.AuthorizeAsync((函数按顺序调用的不同函数收集的步骤。从代码中我们可以看到这一行
if (token == null || (token.RefreshToken == null && token.IsExpired(flow.Clock)))
检查用户是否已通过身份验证。如果是,则进行下一步,否则它将对用户进行身份验证。所以我可以为我编写这个简单的函数:
public async Task<bool> IsUserAuthenticated()
{
var initializer = new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = Constants.ClientId,
ClientSecret = Constants.ClientSecret
},
Scopes = new[] { BloggerService.Scope.Blogger },
DataStore = new StorageDataStore()
};
var flow = new AuthorizationCodeFlow(initializer);
var codeReceiver = new AuthorizationCodeBroker();
var token = await flow.LoadTokenAsync("user", CancellationToken.None).ConfigureAwait(false);
if (token == null || (token.RefreshToken == null && token.IsExpired(flow.Clock)))
{ return false; }
else
{ return true; }
}