我正在开发一个使用Firebase Auth处理身份验证的Flutter应用。但是,该应用程序的某些部分使用WebView来显示来自网络版本(也使用Firebase Auth)的内容。我的问题是如何确保已登录该应用程序的用户也可以在WebView中登录。
答案 0 :(得分:1)
Firebase内置任何功能,无法自动将身份验证状态从本机代码同步到从该本机代码打开的Web视图中。
应该可以将ID令牌从本机代码传递到Web视图并在其中使用它,但我自己从未尝试过。
我找到了一些相关链接:
这些都不是Flutter + WebView的预构建解决方案,但是我希望将它们结合起来可以让您自己构建一些东西。如果您这样做:请分享! :)
答案 1 :(得分:0)
面对自己的挑战,我正在考虑以下方法:
使用本机UI登录到应用程序
调用云函数为您提供一个随机令牌,其中令牌将是由云函数生成的某些文档的文档ID,以说出包含当前/webViewUserTokens
的集合user.uid
; ...为了提高安全性,还可以设置一个expiresTimestamp
字段。
在您用来打开Web视图的URL中,在URL中传递令牌,例如:http://app.com/appPage/<token>
让HTTP端点云功能获取令牌,进行查找,如果有效,然后处理对webView UI的请求。如果无效,请显示错误请求html
用户提交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 注入)。