2012-05-18 14 views
5

मैं एक सिस्टम के सर्वर हिस्से को विकसित कर रहा हूं जिसे किसी डिवाइस को संदेश भेजना है। यह GoogleLogin विधि के साथ ठीक काम कर रहा था, लेकिन मैं इसे OAuth 2.0 में माइग्रेट करना चाहता हूं क्योंकि अन्य प्रमाणीकरण विधि को बहिष्कृत कर दिया गया है।मैं OAuth2 के साथ प्रमाणीकृत सर्वर से C2DM का उपयोग कर किसी डिवाइस को संदेश कैसे भेज सकता हूं?

Google API कंसोल में मैंने एक प्रोजेक्ट बनाया और फिर मैंने सेवा खाते के लिए एक कुंजी बनाई।

public boolean authenticateServer(){ 
    try { 
     File privateKey = 
      new File(getClass().getResource("/something-privatekey.p12").toURI()); 

     GoogleCredential cred = 
      new GoogleCredential.Builder().setTransport(new NetHttpTransport()) 
       .setJsonFactory(new JacksonFactory()) 
       .setServiceAccountId("[email protected]") 
       .setServiceAccountScopes("https://android.apis.google.com/c2dm") 
       .setServiceAccountPrivateKeyFromP12File(privateKey) 
       .addRefreshListener(this) 
       .build(); 

     boolean success = cred.refreshToken(); 
     this.credential = cred; 
     return success;   
    } 
    catch (Exception ex) { 
     //handle this 
    } 
    return false; 
} 

जब मैं इस पर अमल, विधि onTokenResponse कहा जाता हो जाता है और मैं साथ token_type "वाहक" एक access_token प्राप्त 3600 सेकंड में समाप्त हो रही:

इस कोड मैं सर्वर को प्रमाणित करने का उपयोग कर रहा है। अब तक सब ठीक है.

यह वह कोड है जिसका उपयोग मैं डिवाइस को संदेश भेजने के लिए कर रहा हूं, जो हमेशा मुझे 401 स्थिति (अधिकृत नहीं) दे रहा है। कोई विचार?

private static String UTF8 = "UTF-8"; 
public void sendMessage(String text, String registrationId) { 
    try { 
     StringBuilder postDataBuilder = new StringBuilder(); 
     postDataBuilder 
      .append("registration_id") 
      .append("=") 
      .append(registrationId); 

     postDataBuilder.append("&") 
      .append("collapse_key") 
      .append("=") 
      .append("0"); 

     postDataBuilder.append("&") 
      .append("data.payload") 
      .append("=") 
      .append(URLEncoder.encode(text, UTF8)); 

     byte[] postData = postDataBuilder.toString().getBytes(UTF8); 

     URL url = new URL("https://android.apis.google.com/c2dm/send"); 

     HostnameVerifier hVerifier = new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }; 

     HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
     conn.setHostnameVerifier(hVerifier); 
     conn.setDoOutput(true); 
     conn.setUseCaches(false); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty(
      "Content-Type", "application/x-www-form-urlencoded"); 
     conn.setRequestProperty(
      "Content-Length", Integer.toString(postData.length)); 
     conn.setRequestProperty(
      "Authorization", "Bearer " + credential.getAccessToken()); 

     OutputStream out = conn.getOutputStream(); 
     out.write(postData); 
     out.close(); 
     int sw = conn.getResponseCode(); 
     System.out.println("" + sw); 
    } 
    catch (IOException ex){ 
     //handle this 
    } 
} 

धन्यवाद!

उत्तर

2

चूंकि सी 2 डीएम बीटा स्थिति में है, इसलिए ओएथ 2.0 का उपयोग करके इसे काम करने का एकमात्र तरीका एक सेवा खाते (Google एपीआई कंसोल में) के बजाय वेब एप्लिकेशन क्लाइंट आईडी बनाना है।

मैंने http://michsan.web.id/content/how-code-android-c2dm-oauth-2 में दिए गए चरणों का पालन किया है और यह पूरी तरह से

पर काम किया है
संबंधित मुद्दे