【问题标题】:Google oauth api sign out issue in google api dot net clientgoogle api dot net 客户端中的 Google oauth api 注销问题
【发布时间】:2014-05-03 05:20:09
【问题描述】:

我正在使用“Google.Apis.YouTube.v3 Client Library1.8.1.1050”Nuget 包来访问 Windows Phone 8 中的 API。我能够使用此 API 成功执行登录功能。只有使用经过身份验证的 Google 帐户详细信息登录,我才能在 YouTube API v3 上执行某些操作。我还可以使用此 API 从 Youtube 获取所有提要。现在,我在使用 Google API V3 oAuth2 时遇到了一个问题。 我正在使用以下代码使用 Google 帐户登录:

UserCredential credential;
using (var stream = new FileStream("clientdata.json", FileMode.Open, FileAccess.Read)){

    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
    GoogleClientSecrets.Load(stream).Secrets,
    // This OAuth 2.0 access scope allows for read-only access to the authenticated 
    // user's account, but not other types of account access.
    new[] { YouTubeService.Scope.Youtubepartner },
    "user",
    CancellationToken.None);}

使用此代码,我可以成功登录并获取所有提要。但现在我的问题是如何使用 Google API v3 从 Windows Phone 8 应用程序中注销? 据我所知,此包中没有可用的方法来清除用户凭据。 现在,我正在调用一个网络服务

https://accounts.google.com/o/oauth2/revoke?token={访问令牌}

撤销当前的访问令牌,但这没有多大帮助。

如果我能得到任何帮助来解决这个问题,那就太好了。如果需要更正,请告诉我。 如果有人可以提供有关如何在 Windows Phone 中有效使用此 API 的文档或示例示例,那就更好了。

提前致谢

【问题讨论】:

    标签: windows-phone-8 youtube-api google-api-dotnet-client


    【解决方案1】:

    您现在可以在 UserCredential 对象上调用

    await myUserCredential.RevokeTokenAsync(null);
    

    这将删除用户令牌,并要求他再次授权。

    或者有REST APIhttps://developers.google.com/identity/protocols/OAuth2WebServer#tokenrevoke

    https://accounts.google.com/o/oauth2/revoke?token={token}
    

    【讨论】:

    • 这就是答案。 RevokeTokenAsync 不接受空参数,所以需要credential.RevokeTokenAsync(new CancellationToken());
    • 我的回答已经快两年了,所以新的 API 版本可能发生了变化?但它仍然可以在我的旧应用程序中使用 null
    【解决方案2】:

    从隔离存储中删除由 Google 身份验证库调用创建的文件。使用 Microsoft windows phone 工具查找该文件的名称。对于 Windows 手机应用程序,它很可能是 - “Google.Apis.Auth.OAuth2.Responses.TokenResponse-user”。

    WebBrowser wb = new WebBrowser();
    var url = "http://accounts.google.com/Logout";
    wb.Navigate(new Uri(url, UriKind.RelativeOrAbsolute));
    await wb.ClearCookiesAsync();
    
    using (IsolatedStorageFile iS = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (iS.FileExists("Google.Apis.Auth.OAuth2.Responses.TokenResponse-user"))
                    {
                        iS.DeleteFile("Google.Apis.Auth.OAuth2.Responses.TokenResponse-user");
                    }
                }
    

    【讨论】:

      【解决方案3】:

      您必须在注销用户后清除 cookie。注销用户,SDK 中没有任何内置功能。所以请尝试以下代码作为注销功能。

      private async void logout(object sender, System.Windows.Input.GestureEventArgs e)
      {
          WebBrowser wb = new WebBrowser();
          var url = "http://accounts.google.com/Logout";
          wb.Navigate(new Uri(url, UriKind.RelativeOrAbsolute));
          await wb.ClearCookiesAsync();
      }
      

      【讨论】:

      • 嗨 Rohit,我也在做同样的事情,但我提到的那行代码仍在返回凭据和访问令牌。
      • @DotNet Weblineindia 您确定需要将访问令牌作为 GET 参数发送...我确定这违反了安全性并且不安全...您是否尝试过 POST 请求同样,注销用户也会撤销访问令牌。那你为什么要手动做呢?
      • 我几乎尝试了所有可能的方法。当我手动执行此操作时,它正在撤销访问令牌,但我需要关闭我的应用程序。当我重新启动并尝试登录时,应用程序再次询问用户详细信息以进行登录。但我不想关闭应用程序。我想要灵活的登录/注销功能。
      • 在再次登录之前清除 Web 浏览器 cookie...我正在做同样的事情,不需要关闭我的应用程序即可再次登录。请参考我再次建议的注销方法。
      【解决方案4】:

      首先,我在我们的问题跟踪器中为该问题创建了一个新问题:https://code.google.com/p/google-api-dotnet-client/issues/detail?id=463,希望它会在下一个版本中得到修复。

      还请解释为什么“这没有多大帮助”。

      现在,请尝试调用您提到的 revoke 方法。此外(目前......)我建议创建一个新的 UserCredential(使用不同的“用户”)和一个新服务,如果它有效,请告诉我

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 2021-04-25
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多