2012-05-18 3 views
5

Ich entwickle den Server Teil eines Systems, das Nachrichten an ein Gerät senden muss. Dies funktionierte gut mit der GoogleLogin-Methode, aber ich möchte es zu OAuth 2.0 migrieren, da die andere Authentifizierungsmethode nicht mehr unterstützt wird.Wie kann ich eine Nachricht an ein Gerät senden, das C2DM von einem Server verwendet, der mit OAuth2 authentifiziert wurde?

In der Google API-Konsole habe ich ein Projekt erstellt und dann einen Schlüssel für ein Dienstkonto erstellt.

Dies ist der Code, den ich den Server zu authentifizieren bin mit:

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; 
} 

Als ich dies auszuführen, wobei das Verfahren onTokenResponse und ich auslaufenden ein access_token mit token_type „Bearer“ in 3600 Sekunden aufgerufen wird. So weit, ist es gut.

Dies ist der Code, den ich verwende, um die Nachricht an das Gerät zu senden, die mir immer einen 401-Status (nicht autorisiert) gibt. Irgendwelche Ideen?

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 
    } 
} 

Vielen Dank!

Antwort

Verwandte Themen