2012-05-18 19 views
5

Zajmuję się tworzeniem części serwerowej systemu, który musi wysyłać wiadomości do urządzenia. To działało dobrze z metodą GoogleLogin, ale chcę przeprowadzić migrację do OAuth 2.0, ponieważ inna metoda uwierzytelniania została uznana za przestarzałą.Jak wysłać wiadomość do urządzenia za pomocą C2DM z serwera uwierzytelnionego za pomocą OAuth2?

W konsoli Google API utworzyłem projekt, a następnie utworzyłem klucz do konta usługi.

Jest to kod używam do uwierzytelniania serwera:

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

Kiedy wykonać to metoda onTokenResponse jest wywoływana i dostaję access_token z token_type „na okaziciela” wygasających w 3600 sekund. Jak na razie dobrze.

To jest kod, którego używam do wysyłania wiadomości na urządzenie, co zawsze daje mi status 401 (nie autoryzowany). Jakieś pomysły?

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

Dzięki!

Odpowiedz

Powiązane problemy