Android Firebase-登录到不同项目上的多个实时数据库
我有一个主要的Firebase Relatime数据库,用户可以登录和访问数据。 我也有一些其他的数据库,我希望他们能够登录到以及 因此,他们的想法是使用电子邮件和密码登录到“数据库A”,然后在菜单中有一个选项可以查看来自另一个“数据库B”和“数据库C”的报告 当我尝试切换数据库时,Android Firebase-登录到不同项目上的多个实时数据库,firebase,firebase-realtime-database,firebase-authentication,Firebase,Firebase Realtime Database,Firebase Authentication,我有一个主要的Firebase Relatime数据库,用户可以登录和访问数据。 我也有一些其他的数据库,我希望他们能够登录到以及 因此,他们的想法是使用电子邮件和密码登录到“数据库A”,然后在菜单中有一个选项可以查看来自另一个“数据库B”和“数据库C”的报告 当我尝试切换数据库时,权限被拒绝。确切的错误是: 侦听/用户失败:数据库错误:权限被拒绝 我正在尝试从/users路径获取用户列表 现在的问题是,虽然用户使用相同的电子邮件和密码存在于所有数据库中,但我认为这对firebase来说并不重要
权限被拒绝
。确切的错误是:
侦听/用户失败:数据库错误:权限被拒绝
我正在尝试从/users
路径获取用户列表
现在的问题是,虽然用户使用相同的电子邮件和密码存在于所有数据库中,但我认为这对firebase来说并不重要,因为UID
是不同的。那么,我怎样才能用同一个用户毫无顾忌地登录到多个项目,或者这是可能的
以下是我目前掌握的情况:
private void switchDatabase(AvailableDatabase selectedDatabase) {
Log.d(TAG, String.format(Locale.ENGLISH, "Switching DB: Name: %s, ID: %s, URL: %s", selectedDatabase.getName(), selectedDatabase.getApplicationId(), selectedDatabase.getUrl()));
if (selectedDatabase.getApplicationId() == null || selectedDatabase.getUrl() == null) {
Snackbar.make(findViewById(android.R.id.content), "Invalid DB Connection for " + selectedDatabase.getName(), Snackbar.LENGTH_SHORT).show();
return;
}
FirebaseOptions options = new FirebaseOptions.Builder()
.setApplicationId(selectedDatabase.getApplicationId())
.setApiKey(getResources().getString(R.string.google_api_key)) // Required for Auth.
.setDatabaseUrl(selectedDatabase.getUrl()) // Required for Realtime DB.
.build();
//Get secondary DB.
// First try get by name, in case it already exists.
// If that fails, create it
FirebaseApp app;
try {
app = FirebaseApp.getInstance(selectedDatabase.getName());
} catch (IllegalStateException e) {
Log.d(TAG, "Firebase DB " + selectedDatabase.getName() + " doesn't exist. Creating...");
app = FirebaseApp.initializeApp(this, options, selectedDatabase.getName());
}
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(app);
secondaryDatabase.getReference().child(FB_USER).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//do stuff
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Snackbar.make(findViewById(android.R.id.content), "DB request cancelled:getUsers::" + databaseError.getMessage(), Snackbar.LENGTH_SHORT).show();
}
});
}
以下是适用于/用户的firebase规则:
"users" : {
".read" : "auth != null && (root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 1' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 2'|| root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 3' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 4')",
".write" : "auth != null && (root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 1' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 2'|| root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 3' || root.child('users').child(auth.uid).child('profile').child('access_level').val() === 'Level 4')"
},
如您所见,它们与auth.uid
绑定。如果我来自另一个项目,用户电子邮件将是相同的,但自动生成的UID不会是相同的,因此权限失败,因为auth.UID
不存在
谢谢。简单地说:
// Retrieve other app.
FirebaseApp otherApp = FirebaseApp.getInstance("otherApp");
// Get the database for the other app.
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);
请在此处阅读更多信息:
对于使用Firebase的Android应用程序,有一个中心FirebaseApp对象
它管理所有Firebase API的配置。这是
当您的应用程序运行时,由内容提供商自动初始化
启动,您通常不需要与之交互。然而,
当您想从单个应用程序访问多个项目时,您将
需要一个独特的FirebaseApp来单独引用每个应用程序。它是
由您来初始化除默认值以外的实例
Firebase为您创造了一个全新的平台。例如,连接到默认的
Firebase数据库实例,我们隐式使用默认的Firebase
应用程序:
要从另一个项目连接到另一个Firebase实时数据库,
您首先需要为另一个实例初始化FirebaseApp实例
Firebase项目,并给它一个标识符-在本例中
“中学”:
API,但这次指定要通过哪个项目访问
将相关FirebaseApp传递给FirebaseDatabase.getInstance():
简而言之:
// Retrieve other app.
FirebaseApp otherApp = FirebaseApp.getInstance("otherApp");
// Get the database for the other app.
FirebaseDatabase otherDatabase = FirebaseDatabase.getInstance(otherApp);
请在此处阅读更多信息:
对于使用Firebase的Android应用程序,有一个中心FirebaseApp对象
它管理所有Firebase API的配置。这是
当您的应用程序运行时,由内容提供商自动初始化
启动,您通常不需要与之交互。然而,
当您想从单个应用程序访问多个项目时,您将
需要一个独特的FirebaseApp来单独引用每个应用程序。它是
由您来初始化除默认值以外的实例
Firebase为您创造了一个全新的平台。例如,连接到默认的
Firebase数据库实例,我们隐式使用默认的Firebase
应用程序:
要从另一个项目连接到另一个Firebase实时数据库,
您首先需要为另一个实例初始化FirebaseApp实例
Firebase项目,并给它一个标识符-在本例中
“中学”:
API,但这次指定要通过哪个项目访问
将相关FirebaseApp传递给FirebaseDatabase.getInstance():
是的,这似乎是关于这个话题的唯一在线资源。但是,它不完全满足我的需要(即浏览独特的UID)。谢谢。是的,这似乎是关于这个话题的唯一在线资源。但是,它不完全满足我的需要(即浏览独特的UID)。谢谢。是的,这是我用来获取初始代码的URL。不过,我在提交用户的
UID
时遇到了问题。谢谢。你带过来是什么意思?因为查找登录用户uid非常简单。在数据库中创建一个用户。生成了一个唯一的ID。现在想象一下在第二个数据库中创建相同的用户。将创建另一个唯一ID。这些显然不匹配,因此当我从DB2请求路径时,例如/users//profile/email,它将找不到它,因为UID
不同。由于身份验证提供程序相同,firebase身份验证的UID对于用户来说保持不变。我将并排查看我的2个数据库,并且用户具有不同的UID。我不明白它们怎么会是一样的,因为它们只是在两个不同时间为任意对象创建的JSON字段。我没有使用Google/Facebook的SSO表单。是的,这是我用来获取初始代码的URL。不过,我在提交用户的UID
时遇到了问题。谢谢。你带过来是什么意思?因为查找登录用户uid非常简单。在数据库中创建一个用户。生成了一个唯一的ID。现在想象一下在第二个数据库中创建相同的用户。将创建另一个唯一ID。这些显然不匹配,因此当我从DB2请求路径时,例如/users//profile/email,它将找不到它,因为UID
不同。由于身份验证提供程序相同,firebase身份验证的UID对于用户来说保持不变。我将并排查看我的2个数据库,并且用户具有不同的UID。我不明白它们怎么会是一样的,因为它们只是在两个不同时间为任意对象创建的JSON字段。我没有使用谷歌/Facebook的SSO表单。
FirebaseOptions options = new FirebaseOptions.Builder()
.setApplicationId("1:530266078999:android:481c4ecf3253701e") // Required for Analytics.
.setApiKey("AIzaSyBRxOyIj5dJkKgAVPXRLYFkdZwh2Xxq51k") // Required for Auth.
.setDatabaseUrl("https://project-1765055333176374514.firebaseio.com/")
// Required for RTDB.
.build();
FirebaseApp.initializeApp(this /* Context */, options, "secondary"); Then, you can access the database using the same client
// Retrieve my other app.
FirebaseApp app = FirebaseApp.getInstance("secondary");
// Get the database for the other app.
FirebaseDatabase secondaryDatabase = FirebaseDatabase.getInstance(app);