Как передать токен Firebase Auth в webView и зарегистрироваться для уведомлений на Android - PullRequest
0 голосов
/ 14 октября 2019

У меня есть Firebase WebApp, который предоставляет информацию для пользователя. В дополнение к приложению мне нужно отправлять push-уведомления через Firebase Cloud Messaging пользователям с приложением Android.

Цель: у пользователя должен быть один вход в приложение, которое регистрирует их для уведомлений и загружает WebApp через WebView.

Проблема: я не могу найти подход, который достигает этого содин логин. В каждом случае мне нужно войти один раз для родного приложения, а затем еще раз через веб-просмотр.


Во-первых, некоторые ссылки для других, которые могут выяснить вещи:

Пользовательский интерфейс Firebase Auth: https://firebase.google.com/docs/auth/android/firebaseui

База данных Firebase: https://firebase.google.com/docs/database/android/read-and-write

Firebase Cloud Messaging: https://firebase.google.com/docs/cloud-messaging/android/topic-messaging

Предыстория: я могу обрабатывать каждую аутентификацию отдельно, используя пользовательский интерфейс Firebase Auth, чтобы обрабатывать аутентификацию уведомлений, а затем обрабатывать аутентификацию webView через сервер firebase,Это работает, но плохой пользовательский опыт. Поскольку встроенная аутентификация уже предоставляет токен, я должен каким-то образом иметь возможность пропустить второй этап и напрямую войти в систему. Вот подходы, которые я попробовал:


ПЕРВЫЙ ПОДХОД:

Собственный вход в систему с последующим входом в веб-приложение (работает, но требуется два входа): следуя учебному пособию по Firebase Auth UI UIЯ могу завершить успешный вход в систему:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

'user' не равен NULL и может использоваться для чтения данных из базы данных Firebase. Затем идентификаторы тем используются для подписки на темы согласно документации FCM.

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

myWebView.loadUrl("https://someproject.appspot.com/index.html");

ВТОРОЙ ПОДХОД:

Передайте пользовательский токен с помощью myWebView.loadUrl () (авторизация отклонена) ... На основании этой информации: https://firebase.google.com/docs/cloud-messaging/auth-server

Что-то похожее на это, я ожидаю:

...

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

  if (user != null) {

  //get the user id token

  user.getIdToken(true).addOnCompleteListener(new 
  OnCompleteListener<GetTokenResult>() {

    public void onComplete(@NonNull Task<GetTokenResult> task) {

      if (task.isSuccessful()) {

        //here is the idToken

        String idToken = task.getResult().getToken();

  }}}}

HashMap<String, String> map = new HashMap<String, String>();

String bearer = "Bearer " + idToken;

//Create header of the form "Authorization: Bearer <token>"

map.put("Authorization",bearer);

myWebView.loadUrl("https://someproject.appspot.com/index.html", map);

...

* Похоже, это наиболее вероятный способ работы, возможно, мне нужно добавить некоторый код на стороне сервера для явной обработки запроса, а не полагаться на обработчик onStateChanged? Также пытались использовать? Auth = и? Access_token = на основе: https://firebase.google.com/docs/database/rest/auth#authenticate_with_an_id_token Вид стрельбы в темноте здесь ...

ТРЕТИЙ ПОДХОД:

Откройте веб-приложение и активируйтеonAuthStateChanged, когда авторизация завершена. (Кажется, что обработчик никогда не срабатывает. Я подозреваю, что WebView не влияет на объект FirebaseAuth)

...
//Register a FirebaseAuth Listener

FirebaseAuth.AuthStateListener mAuthListener = new FirebaseAuth.AuthStateListener() {

  @Override

  public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

    FirebaseUser user = firebaseAuth.getCurrentUser();

    if (user != null) {

      //Register notification subscriptions per tutorial

    }
...

myWebView.loadUrl ("https://someproject.appspot.com/index.html");


Кажется, что есть лучшийздесь практика, которая не очень хорошо документирована в уроках Firebase. Это также кажется типичной задачей для тех, кто использует FireBase на Android. Может ли кто-то предложить подход, который регистрирует темы уведомлений и получает доступ к webApp в один логин? Чего мне не хватает?

Ожидаемые результаты - один логин, после чего пользователь получает доступ к веб-приложению и регистрируется для отдельных push-уведомлений.

...