检查用户是否已登录

时间:2014-12-02 19:41:12

标签: c# google-api windows-phone-8.1

我正在开发一个使用Google Blogger Api的Windows Phone 8.1应用程序。对于授权,我使用 GoogleWebAuthorizationBroker.AuthorizeAsync()功能,一切顺利,我可以用我的博客做任何事情(获取博客/帖子列表,编辑,删除,添加帖子...... )。

当我的应用程序首先打开时,它会调用 GoogleWebAuthorizationBroker.AuthorizeAsync()函数,如果用户已经登录(之前经过身份验证和授权),该函数将返回并重定向到我开始的页面把博客列表。 这对我来说没问题。

我的问题是: 当用户未登录时,我想打开另一个页面(“欢迎'页面”),在那里我将获得有关我的应用程序和登录按钮的一些基本信息。当用户在这种情况下点击该按钮时,我只想调用 GoogleWebAuthorizationBroker.AuthorizeAsync()函数,该函数会将我重定向到登录页面。但我找不到方法来检查用户是否已经登录,只有在这种情况下显示“欢迎”#39;页。

以下是我使用 GoogleWebAuthorizationBroker.AuthorizeAsync()功能的方法。

m_credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
  new ClientSecrets
  {
    ClientId = "my_client_id",
    ClientSecret = "my_client_secret"
  },
  new[] { BloggerService.Scope.Blogger },
  "user", CancellationToken.None);

1 个答案:

答案 0 :(得分:1)

最后我找到了我的问题的解决方案,并想在这里分享它对某人有帮助。

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