12

मैं Google एपीआई और Google Analytics में सी # में काम करने के लिए एक सरल सेवा acccount लॉगिन प्राप्त करने की कोशिश कर रहा हूं। मेरी कंपनी पहले से ही Analytics में डेटा प्राप्त कर रही है, और मैं अपने क्वेरी एक्सप्लोरर के साथ जानकारी पूछ सकता हूं, लेकिन नेट में शुरू करना कहीं भी नहीं जा रहा है। मैं पीकेआई के साथ एक Google द्वारा जेनरेट की गई जेसन फ़ाइल का उपयोग कर रहा हूं, क्योंकि दस्तावेज कहता है कि ऐसा सेवा खाता गुगल एपीआई के साथ कंप्यूटर से कंप्यूटर संचार का उचित तरीका है। कोड snipet:सी # में सेवा खाते के साथ Google API में लॉगिन कैसे करें - अमान्य प्रमाण-पत्र

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 

यह सब ठीक संकलित, लेकिन जब यह निष्पादित() बयान मारा, एक GoogleApiException त्रुटि फेंक दिया जाता है:

[अमान्य साख] स्थान [प्राधिकरण - हेडर] कारण [authError ] डोमेन [वैश्विक]

मुझे क्या याद आ रही है?

उत्तर

17

ऐसा लगता है कि GoogleAnalytics एक सामान्य GoogleCredential उपभोग कर सकते हैं नहीं है और एक ServiceAccountCredential के रूप में यह व्याख्या (भले ही यह स्वीकार किया है, interally, कि यह वास्तव में उस प्रकार की है)। इस प्रकार आपको ServiceAccountCredential कठिन तरीके से बनाना होगा। यह भी दुर्भाग्यपूर्ण है कि GoogleCredential प्रमाण पत्र के विभिन्न गुणों का खुलासा नहीं करता है, इसलिए मुझे अपना खुद का निर्माण करना पड़ा।

मैंने जेएसओएन सी # क्लास जेनरेटर http://jsonclassgenerator.codeplex.com/ पर "व्यक्तिगत" सेवा अकाउंट क्रेडेंशियल ऑब्जेक्ट का निर्माण करने के लिए जेएसओएन लाइब्रेरी का उपयोग कर Google API (न्यूटॉन्सॉफ्ट.जेसन) का एक स्वचालित हिस्सा है, सेवा खाते की डाउनलोड की गई जेसन फ़ाइल के आवश्यक हिस्सों को पुनर्प्राप्त किया , अपने ईमेल और निजी कुंजी गुणों का उपयोग करके, आवश्यक प्रमाण पत्र बनाने के लिए। GoogleAnalytics सेवा कन्स्ट्रक्टर को वास्तविक ServiceAccountCredential पास करने, परिणामस्वरूप एक सफल लॉगिन और उस खाते के अनुमत संसाधनों तक पहुंच प्राप्त होती है।

नीचे कोड काम करने का नमूना:

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(); 

कुछ आश्चर्य हो सकता है क्या Google द्वारा उत्पन्न PKI (निजी कुंजी) के साथ सेवा खाता क्रेडेंशियल तरह दिखता है। Google APIs प्रबंधक (IAM & व्यवस्थापक) से https://console.developers.google.com/iam-admin/projects पर, उपयुक्त प्रोजेक्ट का चयन करें (आपके पास इनमें से कम से कम एक है)। अब सेवा खाते (बाएं एनवी लिंक से) का चयन करें, और स्क्रीन के शीर्ष पर सेवा खाता बनाएं। एक नाम भरें, सेट करें एक नई निजी कुंजी चेकबॉक्स प्रस्तुत करें, फिर बनाएं पर क्लिक करें। Google एक JSON फ़ाइल का स्वचालित डाउनलोड करेगा, जो ऐसा कुछ दिखता है:

{ 
    "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

ऐसा लगता है कि किसी ने आपके कोड का उपयोग किया और इसे अपने ब्लॉग पर इस्तेमाल किया। Coz आपने 2016 में इस जवाब का जवाब दिया और उसका ब्लॉग हाल ही में है। मेरा सवाल है कि क्या मैं इसका उपयोग कर एक्सेस टोकन प्राप्त कर सकता हूं .. इसलिए मैं एम्बेड एपीआई के लिए एक्सेस टोकन का उपयोग कर सकता हूं। coz मुझे एक शून्य पहुंच टोकन मिल रहा है। – CyberNinja

+0

मैं आपकी कक्षा जनरेटर सामग्री का उपयोग करने के लिए बहुत आलसी था। तो इसके बजाय मैंने यह किया: 'न्यूटॉन्सॉफ्ट.जेसन.लिंक.जेब्जेक्ट सीआर = (न्यूटॉन्सॉफ्ट.जेसन.लिंक.जेबब्जेक्ट) जेसन कन्वर्ट.डिसरियलइज ऑब्जेक्ट (जेसन); स्ट्रिंग एस = (स्ट्रिंग) cr.GetValue ("private_key"); 'आपके उत्तर के लिए धन्यवाद - इससे बहुत मदद मिली। – robertpb

संबंधित मुद्दे