如何将 Firebase 身份验证令牌传递给 webView 并在 Android 上注册通知

2023-11-24

我有一个 Firebase WebApp,它向用户提供信息。除了应用程序之外,我还需要通过 Firebase 云消息传递向使用 Android 应用程序的用户发送推送通知。

目标:用户应该一次登录到应用程序,既可以注册通知,又可以通过 WebView 加载 WebApp。

问题:我找不到通过单次登录实现此目的的方法。在每种情况下,我都需要登录一次本机应用程序,然后通过 webView 再次登录。


首先,为其他可能正在解决问题的人提供一些参考:

Firebase 身份验证用户界面:https://firebase.google.com/docs/auth/android/firebaseui

Firebase 数据库:https://firebase.google.com/docs/database/android/read-and-write

Firebase 云消息传递:https://firebase.google.com/docs/cloud-messaging/android/topic-messaging

背景:我可以使用 Firebase Auth UI 单独处理每个身份验证,以本地处理通知身份验证,然后通过 firebase 服务器处理 webView 身份验证。这可行,但用户体验很差。由于本机身份验证已经提供了令牌,因此我应该能够跳过第二阶段并直接让用户登录。这是我尝试过的方法:


第一种方法:

本机登录,然后是 Web 应用程序登录(可以工作,但需要两次登录): 通过遵循 Firebase Auth UI 教程,我可以成功完成登录:

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

'user' 不为空,可用于从 firebase 数据库读取数据。然后,主题 ID 用于订阅每个 FCM 文档的主题。

订阅通知后,我们可以使用以下行建立与 Web 应用程序的连接:

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有点像在黑暗中拍摄......

第三种方法:

打开webApp,授权完成后触发onAuthStateChanged。 (处理程序似乎永远不会触发。我怀疑没有 FirebaseAuth 对象受到 webView 的影响)

...
//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 教程中没有详细记录。对于在 Android 上使用 firebase 的人来说,这似乎也是一项典型任务。有人可以提供一种注册通知主题并在一次登录中访问 web 应用程序的方法吗?我缺少什么?

预期结果是单次登录,然后用户就可以访问 Web 应用程序并注册单个推送通知。


以下是 React Native 中使用 WebView 进行 Firebase Auth 的解决方案:

import React from 'react'
import WebView from 'react-native-webview'

export default function HomeScreen(props) {
  // props.user represents firebase user
  const apiKey = props.user.toJSON().apiKey
  const authJS = `
        if (!("indexedDB" in window)) {
          alert("This browser doesn't support IndexedDB")
        } else {
          let indexdb = window.indexedDB.open('firebaseLocalStorageDb', 1)
          indexdb.onsuccess = function() {
            let db = indexdb.result
            let transaction = db.transaction('firebaseLocalStorage', 'readwrite')
            let storage = transaction.objectStore('firebaseLocalStorage')
            const request = storage.put({
              fbase_key: "firebase:authUser:${apiKey}:[DEFAULT]",
              value: ${JSON.stringify(props.user.toJSON())}
            });
          }
        }  
      `
  return <WebView
    injectedJavaScriptBeforeContentLoaded={authJS}
    source={{
      uri: 'http://192.168.1.102:3000',
      baseUrl: 'http://192.168.1.102:3000',
    }}
  />
}

Android 中可能需要类似的逻辑(JS 注入)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Firebase 身份验证令牌传递给 webView 并在 Android 上注册通知 的相关文章

  • Access / Word 2010 VBA 邮件合并尝试打开 [文件夹名称].mdb 而不是 ACCDB 源

    我们正在尝试从 Access 中自动执行邮件合并过程 单击按钮后 VBA 将运行指定当前数据库 accdb 作为数据源并运行 SQL 具体代码如下 Set up Word Dim objWord As Object Set objWord
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse
  • 没有 OAuth 的 Spring Security JWT

    最近我开始学习如何使用oauth 2 0 jwt配置spring boot 我有一个问题 是否可以使用spring boot security jwt避免oauth 2 0 是的 可以使用JWT无需使用标准化的功能OAuth 2 0 flo
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • Typescript 函数接口重载

    我有以下代码 interface MySecondInterface a type A interface MyInterface val1 string val2 string MySecondInterface a
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 自定义 Visual Studio 2008 中的位置栏

    有人成功定制了 VS 2008 的 Places Bar 吗 我从 VS 2005 进行的自定义设置并没有转移到 2008 显然 并且无论我如何处理注册表 我都无法使我的自定义位置出现在 打开 对话框中 我已经阅读并应用了相关的MS KB文
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • 使用泛型全面实现特征

    我正在通过实现矩阵数学来练习 Rust 但遇到了一些障碍 我定义了我认为与矩阵相关的特征 trait Matrix
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议
  • android ndk 硬件调试内存

    背景 我对 C 很有经验 对 Android 和 Java 还很陌生 但这是编程的环境问题 我已经用 ANSI C 开发了一个管理应用程序 可以移植到任何操作系统 只需在依赖于操作系统的代码中添加 UI 即可 它使用相当多的内存 特别是对于
  • CUDA 中指令重放的其他原因

    这是我从 nvprof CUDA 5 5 获得的输出 Invocations Metric Name Metric Description Min Max Avg Device Tesla K40c 0 Kernel MyKernel do

随机推荐

  • 将值列表从 Python 传递到 SQL 查询的 IN 子句

    我正在尝试将如下列表传递给 sql 查询 x 1000000000164774783 1000000000253252111 我在用sqlalchemy and pyodbc连接到sql import pandas as pd from p
  • PHP html 电子邮件,使用 html 模板

    所以我正在尝试做一个 html 邮件系统 我的 html 我想成为一个模板 存储在一个单独的文件中 例如 div div div class content div div class footer div 当我想发送邮件时 我希望我的邮件
  • 使用 POST 重定向到 POST 响应的 JQuery 表单插件文件上传

    请大家帮忙 这是一个主要的拦截器 我有一个使用 NodeJS 的项目jQuery 表单插件 我正在尝试在其中上传文件的打字稿 文件上传后 服务器会向屏幕上呈现的 POST 消息发送响应 在 POST 响应呈现在屏幕上之前 文件确实已成功且完
  • Android Gradle 插件(警告)API“variant.getMergeResources()”已过时,已替换为“variant.getMergeResourcesProvider()”

    我正在尝试构建并运行这个存储库增强图像我遇到了这个错误 引起原因 java lang RuntimeException 创建 sfa 时出错 哪个深入到这个警告警告 应用程序编程接口 variant getMergeResources is
  • OS X 上的 HAXM 不断消失

    我最近使用 El Capitan 将我的 Android 开发环境转移到了 OS X 上 一切都按预期进行 我发现的唯一问题是 每次重新启动 PC 后 HAXM 都会从 dev 中消失 并且 Android Studio 在使用 HAXM
  • 不规则形状的碰撞检测

    我知道如何检查圆是否即将与正方形碰撞 并且我知道如何检测正方形是否即将与正方形碰撞 但是我将如何检测多边形是否即将与正方形碰撞 或者更好的是 当一个多边形即将与另一个多边形碰撞时 或者更好的是 当由不直的线条组成的形状与另一个相似的形状 多
  • 在 R 中绘制回归线

    我想在 R 中绘制一条简单的回归线 我已经输入了数据 但回归线似乎不正确 有人可以帮忙吗 x lt c 10 20 30 40 50 60 70 80 90 100 110 120 y lt c 10 18 25 29 30 28 25 2
  • Scipy sigmoid曲线拟合

    我有一些数据点 想找到一个拟合函数 我想累积高斯 sigmoid 函数会适合 但我真的不知道如何实现这一点 这就是我现在所拥有的 import numpy as np import pylab from scipy optimize imp
  • 来自 Alfresco 中 WebScript 的 HTTP 请求

    我正在使用 JS 控制器在 Alfresco 中编写 WebScript 并且想向本地 HTTP 资源发出 HTTP 请求 该资源是一个基于 Java 的应用程序 并为我提供了自己的 REST API 我的 WebScript 不是共享组件
  • 如何使用 Html Agility Pack 使请求超时

    我正在向当前离线 故意 的远程 Web 服务器发出请求 我想找出使请求超时的最佳方法 基本上 如果请求运行时间超过 X 毫秒 则退出请求并返回null回复 目前 网络请求只是坐在那里等待响应 我该如何最好地解决这个问题 这是当前的代码片段
  • 将 Rust 变量传递给期望能够修改它的 C 函数

    我正在编写一个安全的 Rust 层 通过它我可以调用 Rust 中的 C 库中的函数 我已经使用生成了不安全的绑定Rust 绑定根 但我对 Rust 和 C 在传递指针方面的工作方式之间的差异感到有点困惑 C 函数如下所示 bool ime
  • VSCode 的“打开文件夹时运行”任务中的“打开文件夹时”是什么意思?

    VSCode 去年添加了一项功能 打开文件夹时 自动运行任务 但是使用工作区时 打开文件夹时 是什么意思 具体来说 如果您打开一个工作区 将会 runOn folderOpen 任务运行 如果是这样 怎么办 我这么问是因为我将一个任务配置为
  • HTML5 向后兼容 XHTML 吗?

    简短的问题 我可以将现有 XHTML 1 0 网站的 DOCTYPE 更改为 HTML5 吗 这会导致任何问题吗 很长的故事 我们有一个用 ASP NET Webforms 编写的网站 由于它相当旧 默认的 DOCTYPE 设置为 XHTM
  • 使用他的 ClassType 来转换 TObject?

    我怎样才能让我的代码工作 我试图提出这个问题 但经过几次失败的尝试后 我认为你们通过查看代码会比阅读我的 解释 更快地发现问题 谢谢 setCtrlState memo1 edit1 button1 False procedure setC
  • 带参数的 Django 重定向()

    已经有人问过几个类似的问题 但在花了很长时间后我找不到问题的答案 在下面的代码中 当我使用参数 username 从 myView 重定向到 anotherView 时 它按预期工作正常 但我也需要在此重定向中包含 范围 参数 因为重定向后
  • Android 中强制通过扬声器输出声音

    Android 有没有办法强制通过手机扬声器输出 即使耳机已插入插孔 我知道必须有一种方法 因为当您打电话时 即使插孔中插入了耳机 您也可以让某人使用免提电话 您可以使用以下命令在系统范围内更改此设置AudioManager setSpea
  • oo问题-混合控制器逻辑和业务逻辑

    我不确定我是否使用 标准 术语 但这是我试图解决的一个基本的面向对象问题 我正在编写一个 Windows 窗体 我不需要表单事件处理程序中的逻辑 因此我只需从那里调用自定义对象 在自定义对象中 有两组逻辑 控制器 逻辑 决定需要完成什么以及
  • 编译器生成的默认构造函数会是公共的吗?

    当我写一个类的时候Widget java public class Widget int data String name 编译器生成的构造函数是public or default 公众会像 public class Widget int
  • HTML 中的方括号形成数组。只是传统的还是有意义的?

    我经常看到 特别是在 PHP 世界中 如果你想创建一个 FORM 数组 可以这样写
  • 如何将 Firebase 身份验证令牌传递给 webView 并在 Android 上注册通知

    我有一个 Firebase WebApp 它向用户提供信息 除了应用程序之外 我还需要通过 Firebase 云消息传递向使用 Android 应用程序的用户发送推送通知 目标 用户应该一次登录到应用程序 既可以注册通知 又可以通过 Web