У меня есть версия моего приложения, использующая c2dm из Google без аутентификации oauth, и она отлично работает. Но я хочу перейти на oauth 2. У меня возникла проблема при привязке к отправке сообщения, я продолжаю получать 401 несанкционированного доступа. Я создал учетную запись службы, чтобы получить идентификатор ClientID, адрес электронной почты и закрытый ключ. Я уже зарегистрировался на c2dm (дважды), обновил несколько раз токен аутентификации, и я использую тот же адрес электронной почты на сервере и устройстве. Кто-нибудь знает, почему это происходит?
public static String getToken() {
JsonFactory jsonFactory = new JacksonFactory();
HttpTransport httpTransport = new NetHttpTransport();
String clientId = "****.apps.googleusercontent.com";
String pkcs12Repo = "*****privatekey.p12";
String scope = "https://android.apis.google.com/c2dm";
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(clientId)
.setServiceAccountPrivateKeyFromP12File(new File(pkcs12Repo))
.setServiceAccountScopes(scope)
.build();
credential.refreshToken();
String token = credential.getAccessToken();
return token;
}
public static int sendMessage(String auth_token, String registrationId, String message) {
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(message, "UTF-8"));
byte[] postData = postDataBuilder.toString().getBytes("UTF-8");
URL url = new URL("https://android.clients.google.com/c2dm/send");
HttpsURLConnection.setDefaultHostnameVerifier(new CustomizedHostnameVerifier());
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
conn.setRequestProperty("Content-Length", Integer.toString(postData.length));
conn.setRequestProperty("Authorization", "Bearer " + auth_token);
OutputStream out = conn.getOutputStream();
out.write(postData);
out.close();
int responseCode = conn.getResponseCode();
return responseCode;
}
C2DM не поддерживает аутентификацию OAuth2. ClientLogin AuthToken - это ваш единственный поддерживаемый метод в настоящее время.