使用WebView的Flutter应用中的Firebase Auth

时间:2019-11-06 09:56:27

标签: firebase flutter firebase-authentication

我正在开发一个使用Firebase Auth处理身份验证的Flutter应用。但是,该应用程序的某些部分使用WebView来显示来自网络版本(也使用Firebase Auth)的内容。我的问题是如何确保已登录该应用程序的用户也可以在WebView中登录。

3 个答案:

答案 0 :(得分:1)

Firebase内置任何功能,无法自动将身份验证状态从本机代码同步到从该本机代码打开的Web视图中。

应该可以将ID令牌从本机代码传递到Web视图并在其中使用它,但我自己从未尝试过。

我找到了一些相关链接:

这些都不是Flutter + WebView的预构建解决方案,但是我希望将它们结合起来可以让您自己构建一些东西。如果您这样做:请分享! :)

答案 1 :(得分:0)

面对自己的挑战,我正在考虑以下方法:

  1. 使用本机UI登录到应用程序

  2. 调用云函数为您提供一个随机令牌,其中令牌将是由云函数生成的某些文档的文档ID,以说出包含当前/webViewUserTokens的集合user.uid; ...为了提高安全性,还可以设置一个expiresTimestamp字段。

  3. 在您用来打开Web视图的URL中,在URL中传递令牌,例如:http://app.com/appPage/<token>

  4. 让HTTP端点云功能获取令牌,进行查找,如果有效,然后处理对webView UI的请求。如果无效,请显示错误请求html

  5. 用户提交HTML表单时,可以再使用同一令牌1次来保留user.uid,然后将其从集合中删除

还没有尝试过,不确定是否需要。

如果有帮助,请在此处添加参考,或者找出实际上是否有缺陷的方法

答案 2 :(得分:0)

这是在 React Native 中使用 WebView 进行 Firebase 身份验证的解决方案:

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',
    }}
  />
}

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