我对Firebase很新,我的安全规则也遇到了问题.我有一个注册或登录新用户的Android客户端.在该用户首次登录时,我将他们的数据保存到firebase,如下所示:
public void onAuthenticated(AuthData authData) {
//Save user data to firebase
Map<String, Object> map = new HashMap<String, Object>();
map.put("provider", authData.getProvider());
ref.child("users").child(authData.getUid()).updateChildren(map);
}
Run Code Online (Sandbox Code Playgroud)
(在验证用户时在onAuthenticated()中调用此方法)
但是,似乎我的安全规则不允许用户写入数据库,除非他们的数据已经存储.我的规则如下:
{
"rules": {
"users":{
"$userid": {
".read": "auth.id == $userid && auth !== null",
".write": "auth.id == $userid && auth !== null"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此外,如果重要,这里是一个实际存储数据的示例:

我应该如何修改规则以允许客户端在对服务器进行身份验证后写入用户数据?
编辑:经过一些测试后,似乎这些规则不允许用户向其用户节点写入任何内容,即使它已经存在.
android firebase firebase-security firebase-authentication firebase-realtime-database
我使用方法Firebase.authWithPassword(电子邮件,密码,...)来验证用户.问题是用户何时登录,如何阻止使用此帐户登录.
java android firebase firebase-security firebase-authentication
我尝试使用firebase实现Google登录.我已经阅读了文档并观看了几个视频,但没有一个能够工作.每当我点击Google登录按钮时都没有任何反应.成功登录后,我希望它能够导致主要活动.我的应用程序从登录活动启动.
public class SignIn extends AppCompatActivity {
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private static final String TAG = "SignInActivity";
private static final int RC_SIGN_IN = 9001;
GoogleApiClient mGoogleApiClient;
private static Button googleSignIn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
// Configure Google Sign In
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User …Run Code Online (Sandbox Code Playgroud) 我正在离子1.X中建立聊天,我想使用Firebase作为我的数据库和auth提供者.首先,我希望能够使用Firebase创建和登录用户.我在帐户中启用了简单的电子邮件和密码验证.然而,大多数的教程这样一个与火力地堡2.作品如果我跟着它,我有一个错误:
在我的index.html中,我加载了firebase,如:
<script src="https://cdn.firebase.com/js/client/2.2.4/firebase.js"></script>
<!-- AngularFire -->
<script src="https://cdn.firebase.com/libs/angularfire/1.2.0/angularfire.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
并创建用户:
$scope.signupEmail = function(){
$scope.message = null;
$scope.error = null;
console.log('In signup email with username ' + $scope.data.username + ' email ' + $scope.data.email + ' and password ' + $scope.data.password);
var chatRef = new Firebase('https://some-url.firebaseio.com');
var auth = $firebaseAuth(chatRef);
auth.$createUser({
email: $scope.data.email,
password: $scope.data.password
}).then(function(userData) {
console.log("User created with uid: " + userData.uid);
$scope.message = "User created with uid: " + userData.uid;
}).catch(function(error) {
console.log("Error: " + error); …Run Code Online (Sandbox Code Playgroud) firebase ionic-framework firebase-authentication firebase-realtime-database
如何设置数据库规则以便浏览器可以收听?
var connectedRef = db.ref('.info/connected');
connectedRef.on('value', function(snap) {...});
Run Code Online (Sandbox Code Playgroud)
目前尚不清楚我能够听到什么级别.info/connected.
这是我当前的数据库规则:
{
"rules": {
"service": {
"$service": {
"bot": {
"$bot_id": {
"notification": {
"$user_id": {
".write": "auth != null"
}
},
"player": {
".write": "auth != null",
".read": "auth != null"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud) javascript firebase firebase-security firebase-authentication firebase-realtime-database
因此,这里有两个类似的问题,但没有一个对我有可行的解决方案。
我正在使用从Github下载的Quickstart演示。今天下载。我没有在演示代码中进行任何更改。
我已经解决的一些常见错误(从我读到的内容):
我在Firebase控制台中创建了带有可下载的json文件(使用包名称创建)的项目。我提供了SHA1指纹。
电子邮件/密码登录方法已选中。
我已经更新并安装了Google Play服务和Google Repository(通过Android Studio SDK管理器)
在我的设备上,Google Play服务的版本为9.4.52
如果在Firebase控制台中启用“匿名登录”选项,则可以成功在演示应用程序上匿名登录。但是电子邮件/密码将不起作用。
编辑:不确定我是否做对了,但是我在Logcat中得到了这些
D/EmailPassword: createAccount:chris884@gmail.com
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.
W/ResourcesManager: Asset path '/system/framework/com.android.media.remotedisplay.jar' does not exist or contains no resources.
W/ResourcesManager: Asset path '/system/framework/com.android.location.provider.jar' does not exist or contains no resources.
D/EmailPassword: createUserWithEmail:onComplete:false
Run Code Online (Sandbox Code Playgroud) 因此,我目前正在开发一个项目,其中我使用 Firebase 和 Google 作为唯一的登录/注册提供商实施身份验证。身份验证过程工作正常,但是我想向经过身份验证的用户添加更多且高度特定的属性,并能够操纵这些属性。为此,我计划使用 Google Firestore。
现在的问题是,如何将创建的用户帐户从 firebase auth 镜像到 firestore。我想过只要调用signIn函数就根据UID将其写入firestore,但是存在一个问题,我认为同一用户会有多个条目。
我在一些博客上读到,通过使用云函数可以实现预期的结果,但是我正在寻找可以在下一个项目中实现的解决方案,即使我稍后可能会切换到云函数。
您知道我如何才能达到预期的结果吗?感谢您的帮助,非常感谢!
我已经为我的应用程序实现了重置密码链接(使用https://firebase.google.com/docs/auth/web/manage-users提供的完全相同的 firebase 代码)。当我使用之前在应用程序上注册的 gmail 帐户尝试它时,效果很好(我在 gmail 上收到了重置密码链接,并且能够更改新密码)。但是,当我尝试使用其他电子邮件域(例如专业工作或学校域,例如@mycompany.com或@school.edu)时,它似乎没有收到电子邮件(也不是垃圾邮件)。这很奇怪,因为当我使用该应用程序注册时,我确实收到了使用其他域的“电子邮件验证”链接(来自 firebase),但当我尝试重置密码时却没有收到?关于如何解决这个问题有什么想法吗?
我有一个带有 Next Auth 的私人下一个项目,并且我正在实施仅凭据电子邮件和密码,因为这些用户将在 Firebase Auth 面板中创建。我的下一个身份验证看起来像这样:
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';
import { auth, app } from '@/util/firebase';
import { signInWithEmailAndPassword } from 'firebase/auth';
export default NextAuth({
secret: process.env.NEXTAUTH_SECRET,
pages: {
signIn: '/auth/signin',
},
providers: [
CredentialsProvider({
name: 'Credentials',
credentials: {
email: { label: 'Email', type: 'email' },
password: { label: 'Password', type: 'password' },
},
async authorize(credentials, req) {
try {
const userCredential = await signInWithEmailAndPassword(
auth,
credentials.email,
credentials.password
);
// I want to get …Run Code Online (Sandbox Code Playgroud)我正在尝试检查用户是否已使用他们的电子邮件注册我正在开发的应用程序。我正在使用 firebase 13.0.2。auth.fetchSignInMethodsForEmail 已弃用?还有其他方法可以检查电子邮件是否已被使用吗?
firebase ×10
android ×5
java ×2
javascript ×1
next-auth ×1
next.js ×1
react-native ×1
reactjs ×1