У меня есть 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-уведомлений.