12

C#, Google API 및 Google Analytics에서 간단한 서비스 acccount 로그인이 작동하도록 노력하고 있습니다. 우리 회사는 이미 데이터를 애널리틱스로 가져오고 있으며, 쿼리 익스플로러로 정보를 쿼리 할 수는 있지만, 닷넷을 시작하는 것은 어디에도 없습니다. 문서에서 그러한 서비스 계정이 Googla API와의 컴퓨터 간 통신을위한 적절한 방법이라고 말하면서 Google에서 생성 한 json 파일을 PKI와 함께 사용하고 있습니다. 코드 snipet :C#에서 서비스 계정으로 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

(실제로 해당 유형의 것을, interally,이 인정 되더라도)에 Google 웹은 일반적인 GoogleCredential를 소비하고 ServiceAccountCredential로 해석 할 수없는 것으로 보인다. 따라서 어려운 방법으로 ServiceAccountCredential을 만들어야합니다. GoogleCredential이 자격 증명의 다양한 속성을 노출시키지 않으므로 불행한 점이 있습니다. 따라서 직접 작성해야합니다.

http://jsonclassgenerator.codeplex.com/에서 JSON C# 클래스 생성기를 사용하여 Google API (Newtonsoft.Json)의 자동 부분 인 JSON 라이브러리를 사용하여 "개인"ServiceAccountCredential 객체를 만들고 서비스 계정의 다운로드 한 json 파일의 핵심 부분을 검색했습니다. , 전자 메일 및 비공개 키의 프로퍼티을 사용해, 필요한 자격을 구축합니다. 정품 ServiceAccountCredential을 GoogleAnalytics 서비스 생성자에 전달하면 로그인에 성공하고 해당 계정의 허용 된 리소스에 액세스 할 수 있습니다. 아래 코드를 작업의

샘플 :

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

일부는 PKI (개인 키)와 구글 생성 된 서비스 계정 자격 증명을 어떻게 생겼는지 궁금 수 있습니다. Google API 관리자 (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 년에 이것에 대답했고 그의 블로그는 최근입니다. 내 질문에이 액세스 토큰을 사용할 수 있습니다. 그래서 embed API에 대한 액세스 토큰을 사용할 수 있습니다. 널 액세스 토큰을 받고있어. – CyberNinja

+0

클래스 생성기를 사용하기에는 너무 게을 렀습니다. 대신에 저는 이것을했습니다 :'Newtonsoft.Json.Linq.JObject cr = (Newtonsoft.Json.Linq.JObject) JsonConvert.DeserializeObject (json); string s = (string) cr.GetValue ("private_key");'답변 해 주셔서 감사합니다. – robertpb

관련 문제