2012-08-06 13 views
5

के साथ एक सेवा खाते के साथ Google API प्रमाणीकरण मैं जावा एपीआई के माध्यम से एक Google सेवा खाते प्रमाणीकृत करने के लिए oauth API का उपयोग करने का प्रयास कर रहा हूं। मैं Google Bigquery तक पहुंचने के लिए इसका उपयोग करने की उम्मीद कर रहा हूं। मुझे अपने एपीआई अनुरोधों से एक "अमान्य अनुदान" दिया गया है।जावा एपीआई

/** Global instance of the HTTP transport. */ 
    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 

    /** Global instance of the JSON factory. */ 
    private static final JsonFactory JSON_FACTORY = new JacksonFactory(); 

    private static Bigquery bigquery; 

public ServiceAccountExample() { 

     try { 
      try { 

      GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) 
       .setServiceAccountScopes(BigqueryScopes.BIGQUERY) 
       .setServiceAccountPrivateKeyFromP12File(new File("GoogleBigQuery-privatekey.p12")) 
       //.setRefreshListeners(refreshListeners) 
       //.setServiceAccountUser("email.com") 
       .build(); 


      credential.refreshToken(); 

      bigquery = new Bigquery.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) 
         //.setApplicationName("GoogleBigQuery/1.0") 
         .build(); 

      listDatasets(bigquery, "publicdata"); 

      return; 
      } catch (IOException e) { 
      System.err.println(e.getMessage()); 
      } 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 

} 

SERVICE_ACCOUNT_EMAIL के फार्म के ईमेल पता है::

यहाँ कोड है, जो एक बुनियादी प्रमाणीकरण उदाहरण की एक प्रति है (जो BigQuery के लिए नहीं था .. लेकिन किसी अन्य Google एपीआई) है XXXXXXX @ developer.gserviceaccount.com

अगर मैं क्रेडेंशियल.फ्रेश टोकन() लाइन को हटा देता हूं, तो यह बिगक्वरी को पहली कॉल पर सूचियों में विफल रहता है ... अन्यथा यह क्रेडेंशियल पर विफल रहता है। ताज़ा करें() .. एक ही त्रुटि के साथ ।

क्या BigQuery सेवा खाता प्रमाणीकरण स्वीकार नहीं करता है?

मेरा मानना ​​है कि मैंने एपीआई कंसोल के माध्यम से सब कुछ ठीक से किया है। मेरे पास है:

  • बिग क्वेरी एपीआई पर पहुंच चालू कर दी गई।
  • "एपीआई एक्सेस" टैब के तहत एक सेवा खाता बनाया गया।
  • मेरी निजी कुंजी डाउनलोड की गई (जिसे ऊपर दिए गए कोड से संदर्भित किया गया है)।
  • मेरे सेवा खाता उपयोगकर्ता को "टीम" टैब के नीचे पहुंच "संपादित कर सकते हैं" दिया गया।
  • सक्षम बिलिंग।

क्या मुझे कुछ याद आया है? क्या वहां मेरे कुछ और करने की आवश्यकता है?

धन्यवाद ..

उत्तर

8

सेवा खाता प्राधिकरण विधि BigQuery के साथ बस ठीक काम करता है। आपको credential.refreshToken() पर कॉल करने की आवश्यकता नहीं है। सुनिश्चित करें कि आपकी निजी कुंजी फ़ाइल आपके एप्लिकेशन से पढ़ी जा सकती है। यहाँ एक उदाहरण है:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson.JacksonFactory; 

import com.google.api.services.bigquery.Bigquery; 
import com.google.api.services.bigquery.BigqueryScopes; 
import com.google.api.services.bigquery.Bigquery.Projects; 
import com.google.api.services.bigquery.model.*; 

import java.io.File; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.List; 

public class BigQueryJavaServiceAccount { 

    public static void main(String[] args) throws IOException, InterruptedException, GeneralSecurityException { 

    final HttpTransport TRANSPORT = new NetHttpTransport(); 
    final JsonFactory JSON_FACTORY = new JacksonFactory(); 

    GoogleCredential credential = new GoogleCredential.Builder() 
     .setTransport(TRANSPORT) 
     .setJsonFactory(JSON_FACTORY) 
     .setServiceAccountId("[email protected]") 
     .setServiceAccountScopes(BigqueryScopes.BIGQUERY) 
     .setServiceAccountPrivateKeyFromP12File(new File("key.p12")) 
     .build(); 

    Bigquery bigquery = Bigquery.builder(TRANSPORT, JSON_FACTORY) 
     .setHttpRequestInitializer(credential) 
     .build(); 

    Projects.List projectListRequest = bigquery.projects().list(); 
    ProjectList projectList = projectListRequest.execute(); 
    List<ProjectList.Projects> projects = projectList.getProjects(); 
    System.out.println("Available projects\n----------------\n"); 
    for (ProjectList.Projects project : projects) { 
     System.out.format("%s\n", project.getProjectReference().getProjectId()); 
    } 
    } 
} 
+1

धन्यवाद, माइकल .. शर्मनाक रूप से, मेरी कुंजी सही ढंग से पढ़ी नहीं जा रही थी। मेरा कोड कुंजी के लिए एक पूर्ण पथ के साथ काम किया। – Sprooose

+0

कुंजी कहाँ रखी जानी चाहिए? –

+0

@ आकाशप्रशर को इसे पढ़ने के लिए कुंजी को स्थानीय रूप से रखा जाना चाहिए, लेकिन इसे सुरक्षित रखें, जैसे कि यह एक पासवर्ड था जो आपके पूरे क्लाउड प्रोजेक्ट तक पहुंच प्रदान करता है (जो अनिवार्य रूप से है) –

0

Google Cloud BigQuery client libraries (Maven package) के साथ एक सेवा खाता कुंजी से प्रमाणीकृत करने के लिए आप use Application Default Credentials कर सकते हैं।

पहले अपने सेवा खाते JSON कुंजी फ़ाइल के पूर्ण पथ पर GOOGLE_APPLICATION_CREDENTIALS पर्यावरण चर सेट करें। अपने कोड में, डिफ़ॉल्ट उदाहरण का उपयोग करके BigQuery सेवा ऑब्जेक्ट बनाएं।

import com.google.cloud.bigquery.BigQuery; 
import com.google.cloud.bigquery.BigQueryOptions; 
... 
BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService(); 

के रूप में यह यह संभव ऐसे Google गणना इंजन है, जहां सेवा खाता एक कुंजी फ़ाइल का उपयोग करने से अंतर्निहित होता है बल्कि पर के रूप में कई वातावरण में एक ही कोड का उपयोग करने के लिए बनाता है यह, सिफारिश तरीका है।

वैकल्पिक रूप से, आप construct a credentials object manually from a service account key file की इच्छा कर सकते हैं और BigQuery सेवा ऑब्जेक्ट का उपयोग कर सकते हैं।

import com.google.auth.oauth2.GoogleCredentials; 
import com.google.auth.oauth2.ServiceAccountCredentials; 
import com.google.cloud.bigquery.BigQuery; 
import com.google.cloud.bigquery.BigQueryOptions; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

... 

// TODO: update to your key path. 
File credentialsPath = new File("service_account.json"); 

GoogleCredentials credentials; 
try (FileInputStream serviceAccountStream = new FileInputStream(credentialsPath)) { 
    credentials = ServiceAccountCredentials.fromStream(serviceAccountStream); 
} 

// Instantiate a client. 
BigQuery bigquery = 
    BigQueryOptions.newBuilder() 
     .setCredentials(credentials) 
     .build() 
     .getService(); 
संबंधित मुद्दे