Ключ токена доступа FCM через JavaScript - PullRequest
0 голосов
/ 10 июня 2018

Есть ли возможность получить ключ токена доступа FCM через Java Script на стороне клиента?Я использую Firebase для простого приложения для Android 'и хочу разрешить некоторым пользователям отправлять push-уведомления.

function getAccessToken(){  }

var xhr = new XMLHttpRequest();
xhr.responseType = "json";
xhr.open('POST', "https://fcm.googleapis.com/v1/projects/**********/messages:send", true);
xhr.setRequestHeader('Authorization', "Bearer " + getAccessToken());

Я попытался предложить @Ali со следующим фрагментом кода, но теперь я получаю исключение от refreshAccessToken (...) с сообщением «Области не настроеныдля служебной учетной записи. "Я хочу уточнить, что код DotNet из первого комментария ответа Али все еще работает с тем же файлом JSON.

@JavascriptInterface
private static String readToken() throws IOException, InterruptedException {
    String str = new String("{\n" +
            "  \"type\": \"service_account\",\n" +
            "  \"project_id\": \"*****\",\n" +
            "  \"private_key_id\": \"*****\",\n" +
            "  \"private_key\": \"-----BEGIN PRIVATE KEY-----\\n*****\\n-----END PRIVATE KEY-----\\n\",\n" +
            "  \"client_email\": \"*****\",\n" +
            "  \"client_id\": \"*****\",\n" +
            "  \"auth_uri\": \"*****",\n" +
            "  \"token_uri\": \"*****",\n" +
            "  \"auth_provider_x509_cert_url\": \"*****",\n" +
            "  \"client_x509_cert_url\": \"*****\"\n" + "}\n");

    InputStream stream = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
    GoogleCredentials googleCredential = GoogleCredentials.fromStream(stream);
    googleCredential.createScoped(Arrays.asList("https://www.googleapis.com/auth/firebase.messaging"));

    AccessToken token = googleCredential.refreshAccessToken();
    String x = token.getTokenValue();
    return x;
}

1 Ответ

0 голосов
/ 10 июня 2018

После создания веб-просмотра включите JavaScript, а также присоедините интерфейс JavaScript и назовите его как-нибудь:

WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webview.addJavascriptInterface(this, "InterfaceName");

Теперь вы можете назначить любую функцию Java в интерфейсе JavaScript и получать к ней доступ через веб-страницы.

Пример получения токена FCM пользователя:

@JavascriptInterface
public String readToken(){
    String token = FirebaseInstanceId.getInstance().getToken();
    return token;
}

Пример получения ключа токена доступа FCM ( ссылка ):

@JavascriptInterface
private static String readToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

Чтобы добавитьтокен доступа к заголовку HTTP-запроса:

URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestProperty("Authorization", "Bearer " + getAccessToken());
httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
return httpURLConnection;

, и вы можете вызвать эту функцию с помощью JavaScript внутри WebView, для которого вы определили интерфейс:

<script>
   var token=InterfaceName.readToken();
</scritp>
...