12

Tôi đang tự mình cố gắng đăng nhập vào C#, Google API và Google Analytics. Công ty của tôi đã nhận dữ liệu vào Analytics và tôi có thể truy vấn thông tin bằng Trình khám phá truy vấn của họ, nhưng bắt đầu .Net sẽ không đi đâu cả. Tôi đang sử dụng tệp json do Google tạo với PKI, vì tài liệu nói rằng tài khoản dịch vụ như vậy là cách thích hợp để liên lạc giữa các máy tính với máy tính với API Googla. Mã snipet:Cách đăng nhập vào API Google bằng Tài khoản dịch vụ trong C# - Thông tin đăng nhập không hợp lệ

public static GoogleCredential _cred; 
public static string _exePath; 

static void Main(string[] args) { 
    _exePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(@"file:\", ""); 
    var t = Task.Run(() => Run()); 
    t.Wait(); 
} 

private static async Task Run() { 
    try { 
     // Get active credential 
     using (var stream = new FileStream(_exePath + "\\Default-GASvcAcct-508d097b0bff.json", FileMode.Open, FileAccess.Read)) { 
      _cred = GoogleCredential.FromStream(stream); 
     } 
     if (_cred.IsCreateScopedRequired) { 
     _cred.CreateScoped(new string[] { AnalyticsService.Scope.Analytics }); 
     } 
     // Create the service 
     AnalyticsService service = new AnalyticsService(
      new BaseClientService.Initializer() { 
       HttpClientInitializer = _cred, 
      }); 
     var act1 = service.Management.Accounts.List().Execute(); // blows-up here 

Tất cả biên dịch tốt, nhưng khi nhấn lệnh Execute(), một lỗi GoogleApiException được ném:

[credentials không hợp lệ] Nơi [Authorization - tiêu đề] Lý do [authError ] Miền [toàn cầu]

Tôi đang thiếu gì?

Trả lời

17

Dường như Google Analytics không thể tiêu thụ một generic GoogleCredential và giải thích nó như là một ServiceAccountCredential (mặc dù nó được thừa nhận, interally, mà nó thực sự là của loại). Vì vậy, bạn phải tạo ra một cách khó khăn ServiceAccountCredential. Cũng không may là GoogleCredential không hiển thị các thuộc tính khác nhau của thông tin đăng nhập, vì vậy tôi phải tự xây dựng.

Tôi đã sử dụng Trình tạo lớp C# JSON tại http://jsonclassgenerator.codeplex.com/ để tạo đối tượng ServiceAccountCredential "cá nhân" bằng thư viện JSON là phần tự động của API Google (Newtonsoft.Json), truy xuất các phần thiết yếu của tệp json đã tải xuống của tài khoản dịch vụ , để xây dựng thông tin xác thực được yêu cầu, sử dụng các thuộc tính khóa riêng và email của nó. Chuyển số ServiceAccountCredential chính hãng cho nhà xây dựng dịch vụ GoogleAnalytics, dẫn đến đăng nhập thành công và quyền truy cập vào tài nguyên được phép của tài khoản đó.

mẫu mã làm việc dưới đây:

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Reflection; 
using System.Text; 
using Google.Apis.Auth.OAuth2; 
using Google.Apis.Services; 
using Google.Apis.Analytics.v3; 
using Newtonsoft.Json; 
    . 
    . 
    . 
try 
{ 
    // Get active credential 
    string credPath = _exePath + @"\Private-67917519b23f.json"; 

    var json = File.ReadAllText(credPath); 
    var cr = JsonConvert.DeserializeObject<PersonalServiceAccountCred>(json); // "personal" service account credential 

    // Create an explicit ServiceAccountCredential credential 
    var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.ClientEmail) 
    { 
     Scopes = new[] { 
      AnalyticsService.Scope.AnalyticsManageUsersReadonly, 
      AnalyticsService.Scope.AnalyticsReadonly 
     } 
    }.FromPrivateKey(cr.PrivateKey)); 

    // Create the service 
    AnalyticsService service = new AnalyticsService(
     new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = xCred, 
     } 
    ); 

    // some calls to Google API 
    var act1 = service.Management.Accounts.List().Execute(); 

    var actSum = service.Management.AccountSummaries.List().Execute(); 

    var resp1 = service.Management.Profiles.List(actSum.Items[0].Id, actSum.Items[0].WebProperties[0].Id).Execute(); 

Một số có thể tự hỏi những gì một Google tạo chứng chỉ tài khoản dịch vụ với PKI (Private Key) trông như thế nào. Từ Trình quản lý API của Google (IAM & Quản trị) tại https://console.developers.google.com/iam-admin/projects, hãy chọn dự án thích hợp (bạn có ít nhất một trong các dự án này). Bây giờ, hãy chọn Tài khoản dịch vụ (từ liên kết điều hướng bên trái) và TẠO TÀI KHOẢN DỊCH VỤ ở đầu màn hình. Điền tên, đặt hộp kiểm Cung cấp khóa riêng tư mới, sau đó nhấp vào Tạo. Google sẽ tự động tải xuống tệp JSON, có dạng như sau:

{ 
    "type": "service_account", 
    "project_id": "atomic-acrobat-135", 
    "private_key_id": "508d097b0bff9e90b8d545f984888b0ef31", 
    "private_key": "-----BEGIN PRIVATE KEY-----\nMIIE...o/0=\n-----END PRIVATE KEY-----\n", 
    "client_email": "[email protected]", 
    "client_id": "1123573016559832", 
    "auth_uri": "https://accounts.google.com/o/oauth2/auth", 
    "token_uri": "https://accounts.google.com/o/oauth2/token", 
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", 
    "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-analytics%40atomic-acrobat-135923.iam.gserviceaccount.com" 
} 
+0

Có vẻ như ai đó đã sử dụng mã của bạn và sử dụng mã đó trên blog của mình. Coz bạn đã trả lời câu hỏi này vào năm 2016 và blog của anh ấy vừa mới xuất hiện. Câu hỏi của tôi là tôi có thể nhận được một mã thông báo truy cập bằng cách sử dụng này .. vì vậy tôi có thể sử dụng mã thông báo truy cập cho api nhúng. coz Tôi nhận được một mã thông báo truy cập null. – CyberNinja

+0

Tôi đã quá lười biếng để sử dụng công cụ tạo lớp học của bạn. Vì vậy, thay vào đó tôi đã làm điều này: 'Newtonsoft.Json.Linq.JObject cr = (Newtonsoft.Json.Linq.JObject) JsonConvert.DeserializeObject (json); string s = (string) cr.GetValue ("private_key"); 'Cảm ơn câu trả lời của bạn-- nó đã giúp ích rất nhiều. – robertpb

Các vấn đề liên quan