2017-01-19 12 views
13

के बजाय JSON कुंजी फ़ाइल का उपयोग कर सेट खाता खाता। मैं .p12 कुंजी फ़ाइल का उपयोग कर डोमेन विस्तृत प्रतिनिधिमंडल के साथ Google सेवा खाते का उपयोग करने में सक्षम हूं।Google सेवा खाता डोमेन विस्तृत प्रतिनिधिमंडल सेट सेवा खाता पी 12

मैं पी 12 फ़ाइल की बजाय JSON कुंजी फ़ाइल का उपयोग करना चाहता हूं, लेकिन मैं JSON कुंजी का उपयोग करते समय सेवा खाता आईडी सेट करने का तरीका नहीं समझ सकता।

आप उपयोगकर्ता को JSON कुंजी फ़ाइल का उपयोग करके प्रतिरूपण करने के लिए कैसे सेट करते हैं?

वर्क्स ठीक:

File p12File = new File(...); 
GoogleCredential.Builder b = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
.setJsonFactory(JSON_FACTORY).setServiceAccountId(properties.getServiceAccountId()) 
        .setServiceAccountPrivateKey(SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), 
         new FileInputStream(p12File), "notasecret", 
         "privatekey", "notasecret")) 
        .setServiceAccountScopes(GOOGLE_SCOPE_LIST); 
       if (properties.getServiceAccountEmail() != null) { 
       b = b.setServiceAccountUser(properties.getServiceAccountEmail()); 
       } 
       credential = b.build(); 

काम नहीं करता:

String jsonKeyContents = "{\n" + 
      " \"type\": \"service_account\",\n" + 
      " \"project_id\": \"sxxxxxxx0\",\n" + 
      " \"private_key_id\": \"csxxxxxxxxxxxxxxxx\",\n" + 
      " \"private_key\": \"-----BEGIN PRIVATE " + 
      "KEY-----\\nMIIxxxxxxxxxxsTbwzsbw" + 
      "==\\n-----END PRIVATE KEY-----\\n\",\n" + 
      " \"client_email\": \"[email protected]\",\n" + 
      " \"client_id\": \"1111111111111111111\",\n" + 
      " \"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\n" + 
      " \"token_uri\": \"https://accounts.google.com/o/oauth2/token\",\n" + 
      " \"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\n" + 
      " \"client_x509_cert_url\": \"https://www.googleapis" + 
      ".com/robot/v1/metadata/x509/xxxxx%40xxxxxx-xxxxx-123456.iam.gserviceaccount.com\"\n" + 
      "}"; 
try (InputStream privateKeyInputStream = new ByteArrayInputStream(jsonKeyContents 
      .getBytes("UTF-8"))) { 
     credential = GoogleCredential.fromStream(privateKeyInputStream).createScoped(GOOGLE_SCOPE_LIST); 
} 

JSON कुंजी का उपयोग करते समय सभी एंटरप्राइज़ उपयोगकर्ता सूची निर्देशिका एपीआई का उपयोग करने, मैंने एक त्रुटि संदेश मिलता है:

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found 
{ 
    "code" : 404, 
    "errors" : [ { 
    "domain" : "global", 
    "message" : "Domain not found.", 
    "reason" : "notFound" 
    } ], 
    "message" : "Domain not found." 
} 
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146) 
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321) 
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
... 

सभी मुद्दे इस तथ्य से संबंधित हैं कि सेवा खाता ईमेल रखने के लिए कोई जगह नहीं है।

मुझे यहां क्या याद आ रही है? क्या कोई ऐसा काम करने वाला उदाहरण है जिसके लिए वे कुछ कोड साझा कर सकते हैं?

उत्तर

9

इसके बाद, मुझे जवाब मिल गया।

https://github.com/google/google-api-java-client/issues/1007#issuecomment-264157989

इसे ठीक करने के देखें:

  1. उपरोक्त निर्दिष्ट JSON कुंजी का उपयोग कर एक GoogleCredential credentialFromJson बनाएँ। अर्थात। .setServiceAccountPrivateKey(credentialFromJson.getServiceAccountPrivateKey())

अब यह काम करता है: credential = GoogleCredential.fromStream(privateKeyInputStream).createScoped(GOOGLE_SCOPE_LIST)

  • कोड जहां हम P12 लेकिन बजाय प्रयोग किया p12 फ़ाइल से एक निजी कुंजी बनाने का उपयोग कर एक बिल्डर बनाएं ... इस लाइन का उपयोग करें! \ M/

  • 2

    आपका JSON फ़ाइल

    के रूप में सभी आवश्यक कुंजी मान जोड़े शामिल होना चाहिए निम्नलिखित महत्वपूर्ण

    { 
    "type": "service_account", 
    "project_id": "your project Id", 
    "private_key_id": "private key id", 
    "private_key": "Private key", 
    "client_email": "Client email ending with .iam.gserviceaccount.com", 
    "client_id": "client -id", 
    "auth_uri": "accounts.google.com/o/oauth2/auth", 
    "token_uri": "accounts.google.com/o/oauth2/token", 
    "auth_provider_x509_cert_url": "www.googleapis.com/oauth2/v1/certs", 
    "client_x509_cert_url": "www.googleapis.com/robot/v1/metadata/x509/????? 
    -170710.iam.gserviceaccount.com" 
    } 
    

    तो नीचे दिए गए कोड का उपयोग करें:

    private GoogleCredential authorize1() { 
    
        GoogleCredential credential = null; 
    
        HttpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
    
        JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); 
    
        try { 
    
         InputStream jsonFileStream = 
          DriveSample.class.getClassLoader().getResourceAsStream("client_secrets.json"); 
    
         GoogleCredential readJsonFile = GoogleCredential 
          .fromStream(jsonFileStream, httpTransport, JSON_FACTORY).createScoped(DriveScopes.all()); 
    
         credential = new GoogleCredential.Builder().setTransport(readJsonFile.getTransport()) 
          .setJsonFactory(readJsonFile.getJsonFactory()) 
          .setServiceAccountId(readJsonFile.getServiceAccountId()) 
          .setServiceAccountScopes(readJsonFile.getServiceAccountScopes()) 
          .setServiceAccountPrivateKey(readJsonFile.getServiceAccountPrivateKey()).build(); 
        } catch (IOException exception) { 
         exception.printStackTrace(); 
        } 
        return credential; 
    } 
    
    +0

    इस एक ही सटीक जवाब है https://stackoverflow.com/a/45361542/1174024 –

    +0

    याआ लगभग समान है। ज्यादातर लोगों को गलत JSON फ़ाइल मिलती है जिसमें पहली बार मेरे साथ होने वाले सभी महत्वपूर्ण जोड़े शामिल नहीं होते थे। –

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