Ключ токена доступа FCM через JavaScript

1

Есть ли возможность получить ключ маркера доступа 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;
}
  • 0
    У вас есть веб-приложение в вашем приложении, которое хочет использовать в нем JavaScript?
  • 0
    Да, я использую компонент WebView для просмотра содержимого HTML, и я также включил JavaScript.
Показать ещё 6 комментариев
Теги:
firebase
firebase-cloud-messaging
firebase-authentication

1 ответ

1
Лучший ответ

После создания веб-просмотра включите 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>
  • 0
    Спасибо Али, похоже, для начала неплохо, но похоже, что этот токен не тот, который мне нужен. Следующий код DotNet выполняет эту работу: использование (var stream = new FileStream ("project-firebase-adminsdk.json", FileMode.Open, FileAccess.Read)) {var credential = GoogleCredential.FromStream (поток) .CreateScoped (" googleapis .com / auth / firebase.messaging "," googleapis.com/auth/cloud-platform " ); var token = credential.UnderlyingCredential.GetAccessTokenForRequestAsync (). Result; } // Как я могу сделать это на Java?
  • 0
    Этот код выполняется на сервере или на клиентском устройстве? Если это код сервера, вы можете получить доступ к выводу этой страницы DotNet, используя вызов Ajax. @Itay
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню