2

와 연락처 API에 액세스 할 수 있습니다. 이전 시장 버전에서는 2LO 및 클라이언트 키/클라이언트 비밀번호를 사용하여 Google Apps 도메인에서 인증했습니다. 내 이해는 현재 버전에서이 작업을 수행하는 유일한 방법은 서비스 계정 및 OAuth 2입니다.나는 대부분의 API를 마이그레이션 관리해야하지만 연락처 API에 붙어 있어요 2.</p> <p>새로운 시장 API와 OAUTH을 지원하기 위해 내 마켓 플레이스 응용 프로그램을 업그레이드하는 과정에서 나는 어떻게 서비스 계정

V3 캘린더 API를 기반으로 저는 연락처 API가 볼 수 있음) -

 ServiceAccountCredential credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(serviceAccountEmail) 
      { 
       Scopes = new[] { "https://www.google.com/m8/feeds" }, 
       User = "[email protected]" 
      }.FromCertificate(certificate)); 

     var service = new ContactsService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Contact API Sample", 
     }); 

아무도이 작업을 수행하지 않은 경우 귀하의 조언을 부탁드립니다!

답변

0

글쎄, 아무런 반응이 없으므로 표준 클라이언트 라이브러리가이를 지원하지 않는다고 가정 할 수 있습니다.

이메일 액세스를 위해 다음 게시물을 기반으로 해결 방법을 제안했습니다.

http://www.limilabs.com/blog/oauth2-gmail-imap-service-account

다음과 같은 자신의 게시물을 따라주의해야합니다

  • 이 그가 지정하는 DotNetOpenAuth 버전을 사용해야합니다. 최신 버전은 작동하지 않습니다.
  • 당신은 아래의 코드에 추가 할 수 있습니다 자신의 AssertionFlowClient 클래스는 내가 여기에 제공 한 필요합니다
  • :

    X509Certificate2 certificate = new X509Certificate2(
         serviceAccountCertPath, 
         serviceAccountCertPassword, 
         X509KeyStorageFlags.Exportable); 
    
        AuthorizationServerDescription server = new AuthorizationServerDescription 
        { 
         AuthorizationEndpoint = new Uri("https://accounts.google.com/o/oauth2/auth"), 
         TokenEndpoint = new Uri("https://accounts.google.com/o/oauth2/token"), 
         ProtocolVersion = ProtocolVersion.V20, 
        }; 
    
        AssertionFlowClient provider = new AssertionFlowClient(server, certificate) 
        { 
         ServiceAccountId = serviceAccountEmail, 
         Scope = string.Join(" ", new[] { "https://mail.google.com/", "https://www.google.com/m8/feeds/" }), 
         ServiceAccountUser = userEmail, 
        }; 
    
        IAuthorizationState grantedAccess = AssertionFlowClient.GetState(provider); 
    
        RequestSettings rs = new RequestSettings("iLink"); 
        rs.OAuth2Parameters = new OAuth2Parameters(); 
        rs.OAuth2Parameters.AccessToken = grantedAccess.AccessToken; 
        rs.OAuth2Parameters.RefreshToken = null; 
        rs.OAuth2Parameters.ClientId = null; 
        rs.OAuth2Parameters.ClientSecret = null; 
        rs.OAuth2Parameters.RedirectUri = null; 
    
        ContactsRequest cr = new ContactsRequest(rs); 
        Feed<Contact> f = cr.GetContacts(); 
        foreach (var c in f.Entries) 
        { 
         Response.Write(c.Name.FullName); 
        } 
    
1

나는이 질문에 대한 답이 알고 있지만하지 않는 대안을 추가 AssertionFlowClient 또는 특정 버전의 DotNetOpenAuth가 필요합니다. 이를 통해 원래 질문과 동일한 ServiceAccountCredential 코드를 사용할 수 있습니다 (즉, 동일한 방법을 사용하여 사용자의 Gmail을 쿼리).

내 게시물을 추적 해 주셔서 감사합니다.

private static ServiceAccountCredential GenerateCred(IEnumerable<string> scopes, string delegationUser) 
    { 
     var certificate = new X509Certificate2(certLocation, certPassword, X509KeyStorageFlags.Exportable); 
     var credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(serviceAccountEmail) 
      { 
       Scopes = scopes, 
       User = delegationUser 
      }.FromCertificate(certificate)); 
     return credential; 
    } 

     var credential = GenerateCred(new[] { "https://www.googleapis.com/auth/contacts.readonly" }, userToDelegate); 

     //Get the token for this scope and user 
     await credential.RequestAccessTokenAsync(new CancellationToken()); 

     //use the token to initalize the request 
     var rs = new RequestSettings(projectName) 
     { 
      OAuth2Parameters = new OAuth2Parameters() 
      { 
       AccessToken = credential.Token.AccessToken 
      } 
     }; 

     var request = new ContactsRequest(rs); 
     Feed<Contact> f = request.GetContacts(); 
     foreach (var c in f.Entries) 
     { 
      //process each contact 
     }