我们有Android应用程序与本地用户列表。该应用程序在Firebase中有单个专用用户(其他用户在本地管理),应该用于访问实时数据库。 UID将用于应用安全规则并限制对特定数据元素的访问。我认为我们有两个选择:自定义令牌或服务帐户(带有databaseAuthVariableOverride)。
我想知道使用服务帐户方法可能会带来哪些安全问题?它是否可以完全访问?也许我们可以将其限制在最小的行动范围内?
自定义令牌方法可能在令牌过期时出现问题。有没有办法显着扩展令牌有效性?什么是在android上生成自定义令牌的最佳方法?
答案 0 :(得分:0)
使用服务帐户,您可以对所有已安装的应用程序的数据库进行硬编码访问,换句话说,安装应用程序的每个人都会看到完全相同的内容。
您通常会使用令牌方法,因此您可以将数据库中不同节点的访问权限定制到不同的用户。这通常通过为节点设置一些简单规则来实现,例如:
// Sample firebase rules
{
"rules": {
"messages": {
// Only admin servers with service accounts should r/w here
".read": "auth.uid == 'server-with-svc-acct'",
".write": "auth.uid == 'server-with-svc-acct'",
"$user_id": {
// Users can only read their own nodes
".read": "auth.uid == $user_id",
".write": "auth.uid == $user_id",
}
}
}
}
您可以在official documentation中查看有关如何使用Google+进行身份验证的详细信息,但一般而言,您可以获得唯一的用户ID,然后在实时数据库中写入所需的节点。用户将无法访问任何其他节点,因为规则将限制他:
@Override
protected void onCreate(Bundle savedInstanceState) {
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth){
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
// ...
}
};
// ...
对于您的服务器,可以安全地保护您的服务帐户机密,您可以通过以下方式启动Firebase连接(请注意databaseAuthVariableOverride
?,它与我们在auth.uid
上使用的messages
相匹配firebase.initializeApp({
serviceAccount: "path/to/project-name-secrets.json",
databaseURL: "https://project-name.firebaseio.com",
databaseAuthVariableOverride: {
uid: "server-with-svc-acct"
}
});
节点的根。
{{1}}
有关此内容的更多信息也可以在documentation中找到。