【问题标题】:NativeApplicationClient and OAuth2Authenticator not resolvedNativeApplicationClient 和 OAuth2Authenticator 未解析
【发布时间】:2015-12-19 03:57:54
【问题描述】:

我正在编写一个控制台应用程序来从 BigQuery 下载数据。再一次,.NET 库是模糊和混乱的。 In this question两名 Google 员工发布了回复,但没有一个回复在我的机器上有效,因为他们还没有明确说明他们使用的是哪些参考资料。我再次粘贴代码并详细说明:

using DotNetOpenAuth.OAuth2;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;

using Google.Apis.Bigquery.v2;
using Google.Apis.Util;

{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Register an authenticator.
            var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description);

            // Put your client id and secret here (from https://developers.google.com/console)
            // Use the installed app flow here.
            provider.ClientIdentifier = "<client id>";
            provider.ClientSecret = "<client secret>";

            // Initiate an OAuth 2.0 flow to get an access token
            var auth = new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthorization);

            // Create the service.
            var service = new BigqueryService(auth);

            // Do something with the BigQuery service here
            // Such as... service.[some BigQuery method].Fetch();
        }

        private static IAuthorizationState GetAuthorization(NativeApplicationClient arg)
        {
            // Get the auth URL:
            IAuthorizationState state = new AuthorizationState(new[] { BigqueryService.Scopes.Bigquery.GetStringValue() });
            state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
            Uri authUri = arg.RequestUserAuthorization(state);

            // Request authorization from the user (by opening a browser window):
            Process.Start(authUri.ToString());
            Console.Write("  Authorization Code: ");
            string authCode = Console.ReadLine();
            Console.WriteLine();

            // Retrieve the access token by using the authorization code:
            return arg.ProcessUserAuthorization(authCode, state);
        }
    }
}
  1. 首先,Google.Apis.Authentication 现在已经过时并且 NuGet 鼓励您改用Google.Api.Auth
  2. NativeApplicationClient 无法使用代码中的任何usings 进行解析。也许它被包含在过时的Google.Apis.Authentication 中。
  3. 其中一名员工发布了一个链接 (https://github.com/google/google-api-dotnet-client#Latest_Stable_Release),指向代码的 Github 存储库。但是这个 repo 中的大多数项目都需要我没有的 Windows 8.1。

有没有什么简单明了的代码可以用来下载 BigQuery 查询结果?我想这里的主要问题是制作 auth 对象。

【问题讨论】:

标签: c# oauth-2.0 google-api google-bigquery google-api-dotnet-client


【解决方案1】:

为了安装这个 nuget 包:

PM> 安装包 Google.Apis.Bigquery.v2

这是我通常使用的代码。

/// <summary>
/// Authenticate to Google Using Oauth2
/// Documentation https://developers.google.com/accounts/docs/OAuth2
/// </summary>
/// <param name="clientId">From Google Developer console https://console.developers.google.com</param>
/// <param name="clientSecret">From Google Developer console https://console.developers.google.com</param>
/// <param name="userName">A string used to identify a user.</param>
/// <returns></returns>
public static BigqueryService  AuthenticateOauth(string clientId, string clientSecret, string userName)
{

    string[] scopes = new string[] { BigqueryService.Scope.Bigquery,                // view and manage your BigQuery data
                                     BigqueryService.Scope.BigqueryInsertdata ,     // Insert Data into Big query
                                     BigqueryService.Scope.CloudPlatform,           // view and manage your data acroos cloud platform services
                                     BigqueryService.Scope.DevstorageFullControl,   // manage your data on Cloud platform services
                                     BigqueryService.Scope.DevstorageReadOnly ,     // view your data on cloud platform servies
                                     BigqueryService.Scope.DevstorageReadWrite };   // manage your data on cloud platform servies

    try
    {
        // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%
        UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }
                                                                                     , scopes
                                                                                     , userName
                                                                                     , CancellationToken.None
                                                                                     , new FileDataStore("Daimto.BigQuery.Auth.Store")).Result;

        BigqueryService service = new BigqueryService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "BigQuery API Sample",
        });
        return service;
    }
    catch (Exception ex)
    {

        Console.WriteLine(ex.InnerException);
        return null;

    }

}

【讨论】:

  • 我马上试试。我应该使用什么作为我的用户名?
  • 用户名的唯一目的是创建数据存储。这可能会有所帮助daimto.com/google-net-filedatastore-demystified
  • 好的!但是值应该是多少?可以是什么吗?
  • 它基本上只是一个字符串。有时我使用机器名称,它可以是任何东西。这取决于您真正拥有的系统类型。阅读该帖子,您将了解它的用途并能够决定是否需要它。如果它只是一个用户,您可能不需要它。如果您有多个用户想要访问其帐户,您将需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 2017-07-30
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
相关资源
最近更新 更多