【发布时间】:2022-11-14 10:53:19
【问题描述】:
我previously asked question 保护 firebase 上的实时数据库。我只使用 Firebase 实时数据库来创建聊天应用程序。用户验证在我们自己的服务器上单独工作,我们没有使用任何 firebase auth 服务进行用户验证。正如Frank van Puffelen 建议的一些官方文档。我现在正在生成 JWT 以根据文档进行授权,但由于我们没有使用 firebase 的任何其他服务,我不确定如何使用生成的 JWT 授权实时数据库。
mAuth.signInWithCustomToken(mCustomToken)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success
} else {
// If sign in fails
Toast.makeText(CustomAuthActivity.this, "Authentication failed.",
}
}
});
如何验证用户并保护我们的数据库不受世界影响,以便只有应用程序用户才能编辑他们的节点。
我关注了this guide 使用自定义令牌向 Firebase 进行身份验证。
- 用户使用他们的凭据登录
- 服务器生成自定义令牌 (JWT)。
- 按照文档将其传递给
signInWithCustomToken。 - 之后呢?对于我的用例,指南位不完整。
编辑:过程:
服务器生成 JWT With PHP Firebase JWT
$Token = JWT::encode($request_data,$secret_Key,'HS512');
如果用户登录成功,此令牌将返回给应用程序。
成功用户登录后,我使用从服务器收到的自定义令牌调用登录firebase
firebaseAuth = FirebaseAuth.getInstance();
firebaseAuth.signInWithCustomToken(Session.getJWT())
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isComplete()){
Intent intent=new Intent(getActivity(),MainActivity.class);
getActivity().startActivity(intent);
}
}
});
当用户单击聊天按钮时。检查房间是否已经存在,如果不存在,则为 2 位用户创建一个房间,并使用他们的电话号码,例如9810012345-9810012346
DatabaseReference db = rebaseDatabase.getInstance().getReference();
db.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild(RoomTitle)) {
RoomName(RoomTitle, true);
}else {
RoomName(RoomTitle, false);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
public void RoomName(String Name, boolean RoomExist) {
button_SendMessage.setEnabled(true);
if (!RoomExist) {
Log.d(TAG, "Room Not Exist Creating One);
RoomName.put(Name, "");
FireBaseDatabase.updateChildren(RoomName);
}
// Launch Chat Screen
}
然后在聊天屏幕上添加链接问题数据库结构等项目
databaseReference = FirebaseDatabase.getInstance().getReference().child(Room_Name);
所以创建房间,允许读写消息只创建房间,如果房间不属于用户,则阻止访问。我需要为实时数据库设置规则,只有应用程序用户才能访问他们的房间,即使他们是应用程序用户也不能访问其他人(阻止其他应用程序用户潜入其他用户房间)下面是我们的实时数据库结构示例,以便更好地了解我们的 2用户房的样子。我不确定在应用程序方面有很多事情要做,我觉得它比应用程序代码问题更多的是数据库。
【问题讨论】:
标签: android firebase-realtime-database firebase-security