Using Firebase reauthenticate - javascript
I'll appreciate assistance with how to reauthenticate a user in Firebase. I wonder if it makes any sense adding all these great features if the documentation doesn't explain how to use it:
Currently, this is what I'm trying, and it ain't working. Errors as cannot read property 'credential' of undefined
In constructor:
constructor(#Inject(FirebaseApp) firebaseApp: any) {
this.auth = firebaseApp.auth();
console.log(this.auth);
}
then the function
changePassword(passwordData) {
if(passwordData.valid) {
console.log(passwordData.value);
// let us reauthenticate first irrespective of how long
// user's been logged in!
const user = this.auth.currentUser;
const credential = this.auth.EmailAuthProvider.credential(user.email, passwordData.value.oldpassword);
console.log(credential);
this.auth.reauthenticate(credential)
.then((_) => {
console.log('User reauthenticated');
this.auth.updatePassword(passwordData.value.newpassword)
.then((_) => {
console.log('Password changed');
})
.catch((error) => {
console.log(error);
})
})
.catch((error) => {
console.log(error);
})
}
}
The reauthenticate() method is called on a firebase.User, not on firebase.auth.Auth itself.
var user = firebase.app.auth().currentUser;
var credentials = firebase.auth.EmailAuthProvider.credential('puf#firebaseui.com', 'firebase');
user.reauthenticate(credentials);
Update (July 2017):
There are some breaking change in the 4.0 version of the Firebase Web SDK. From the release notes:
BREAKING: firebase.User.prototype.reauthenticate has been removed in favor of firebase.User.prototype.reauthenticateWithCredential.
As far as I can tell the reauthenticateWithCredentialis a drop-in replacement for the old method.
Here's some code that enabled users to (a) reauthenticate in Firebase and (b) change their passwords after reauthenticating for me. I researched for about an hour while writing this, so hopefully it saves someone a minute.
Wrote in VueJS:
changePassword() {
let self = this; // i use "self" to get around scope issues
var user = firebase.auth().currentUser;
var credential = firebase.auth.EmailAuthProvider.credential(
this.$store.state.userId, // references the user's email address
this.oldPassword
);
user.reauthenticateWithCredential(credential)
.then(function() {
// User re-authenticated.
user.updatePassword(self.newPassword)
.then(function() {
console.log("Password update successful!");
})
.catch(function(error) {
console.log(
"An error occurred while changing the password:",
error
);
});
})
.catch(function(error) {
console.log("Some kinda bug: ", error);
// An error happened.
});
Slight changes as of May 2019, see more details here. Code is as follows:
var user = firebase.auth().currentUser;
var credential = firebase.auth.EmailAuthProvider.credential(user.email, password);
// Prompt the user to re-provide their sign-in credentials
return user.reauthenticateWithCredential(credential);
Call changeEmail("new email","password") in onPressed directly to update the user email with no reauthentication required error
RaisedButton(
onPressed: () {
changeEmail(_emailController.text, _passwordController.text);
}
Future<void> changeEmail(String email, String password) async {
User user = await FirebaseAuth.instance.currentUser;
print(email);
print(password);
try {
try {
var authResult = await user.reauthenticateWithCredential(
EmailAuthProvider.getCredential(
email: user.email,
password: password,
),
);
user.updateEmail(email).then((_) {
print("Succesfull changed email");
_backthrow();
}).catchError((error) {
showAlertDialog(context, error.message);
print("email can't be changed" + error.toString());
});
return null;
} catch (e) {
print("2");
}
} catch (e) {
print(e.message);
showAlertDialog(context, e.message);
}
}
Hers a full example how to reauthenticate with Firebase
var pass = "abcdefg";
var user = firebase.auth().currentUser;
var credential = firebase.auth.EmailAuthProvider.credential(user.email, pass);
user.reauthenticateWithCredential(credential).then(() => {
console.log("Its good!");
}).catch((error) => {
console.log(error);
});
Since 2021: If you use Firebase JS API 9.x (the tree shakable version) this is the most recent way:
https://cloud.google.com/identity-platform/docs/web/reauth
With credentials
import { getAuth, reauthenticateWithCredential } from "firebase/auth";
const auth = getAuth();
const user = auth.currentUser;
// todo for you: prompt the user to re-provide their sign-in credentials
const credential = promptForCredentials();
reauthenticateWithCredential(user, credential).then(() => {
// ...
}).catch((error) => {
// ...
});
With popup
import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth";
const auth = getAuth();
// todo for you: change to appropriate provider
const provider = new OAuthProvider('apple.com');
reauthenticateWithPopup(auth.currentUser, provider)
.then((result) => {
// ...
})
.catch((error) => {
// ...
});
This is how I re-authenticate a user in Firebase:
import { getAuth, EmailAuthProvider, reauthenticateWithCredential } from "firebase/auth";
const auth = getAuth()
const reauthenticateUser = async (email, password) => {
const user = auth.currentUser;
try {
const credential = EmailAuthProvider.credential(email, password);
await reauthenticateWithCredential(user, credential)
} catch (error) {
Alert.alert("Error", "The email or password is incorrect. Please try again.")
}
}
I was getting that re-authentication error auth/requires-recent-login when saving the primary email.
I couldn't figure out how to implement that poorly documented reauthenticateWithCredential(credential) method, so, I simply logged-out the user and redirected to login page. It's a hack but It works like charm!
firebase.auth().signOut();
Related
google auth and firebase persistence
heres my log in function, it works it logs you in via google account, but on refresh it does not stay logged in. what am I doing wrong? sorry I have no idea how to format the code to show correctly here. const provider = new GoogleAuthProvider(); const login = () => {setPersistence(auth, browserSessionPersistence) .then(()=> { signInWithPopup(auth, provider) .then((result) => { const credential = GoogleAuthProvider.credentialFromResult(result); const token = credential?.accessToken; // The signed-in user info. const user = result.user; //console.log({ credentials, token, user }); }) .then(() => { setSignIn(true); }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.email; // The AuthCredential type that was used. const credential = GoogleAuthProvider.credentialFromError(error); //console.log({ errorCode, errorMessage, email, credential }); }); }) };
Firebase automatically restores the user credentials when you restart the app, but your code only responds to the explicit sign in (signInWithPopup). To pick up the automatic restore (and other changes in authentication state), you should use an auth state listener as shown in the first code sample in the documentation on getting the current user: firebase.auth().onAuthStateChanged((user) => { if (user) { // User is signed in, see docs for a list of available properties // https://firebase.google.com/docs/reference/js/firebase.User var uid = user.uid; // ... } else { // User is signed out // ... } });
Since v9, the code has changed. import { getAuth, onAuthStateChanged } from "firebase/auth"; const auth = getAuth(); onAuthStateChanged(auth, (user) => { if (user) { // User is signed in, see docs for a list of available properties // https://firebase.google.com/docs/reference/js/firebase.User const uid = user.uid; // ... } else { // User is signed out // ... } });
Capture error response from Firebase.auth() for display to user
I'm using React Native/Firebase/Redux to build a simple login system. I am trying to work out how to capture errors that happen as a result of failed login attempts. Here's my authscreen.js: const [alertShowing, setAlertShowing] = useState(false); const [alertMessage, setAlertMessage] = useState(''); ... function handleLogin() { const response = dispatch(login(email, password)); console.log(response); } actions.js: export const login = (email, password) => { return async (dispatch) => { try { const response = await Firebase.auth().signInWithEmailAndPassword(email, password); dispatch(getUser(response.user.uid)); } catch (e) { return e; } }; }; My console.log(response) above correctly shows me the error message, but this obviously isn't very useful to users. And please note too that I can log in properly when using correct credentials. What I really want to do in my handleLogin() is check if the response is an error, and if so, setlAlertShowing(true) and setAlertMessage to what I've gotten back from the useDispatch hook so that I may display it nicely to the user. How should I go about this? TIA.
Firebase errors messages are designed for developers and not standard users friendly. The solution is to identify authentication error code and map with user-friendly messages. list of error code https://firebase.google.com/docs/auth/admin/errors You can use function like this to map authError to meaningful error messages. function mapAuthCodeToMessage(authCode) { switch (authCode) { case "auth/invalid-password": return "Password provided is not corrected"; case "auth/invalid-email": return "Email provided is invalid"; // Many more authCode mapping here... default: return ""; } } and use it later export const login = (email, password) => { return async (dispatch) => { try { const response = await Firebase.auth().signInWithEmailAndPassword(email, password); dispatch(getUser(response.user.uid)); } catch (e) { dispatch({type:"authError",message:mapAuthCodeToMessage(e.code)})); } }; };
how to create a user with firebase without signing in [duplicate]
So I have this issue where every time I add a new user account, it kicks out the current user that is already signed in. I read the firebase api and it said that "If the new account was created, the user is signed in automatically" But they never said anything else about avoiding that. //ADD EMPLOYEES addEmployees: function(formData){ firebase.auth().createUserWithEmailAndPassword(formData.email, formData.password).then(function(data){ console.log(data); }); }, I'm the admin and I'm adding accounts into my site. I would like it if I can add an account without being signed out and signed into the new account. Any way i can avoid this?
Update 20161110 - original answer below Also, check out this answer for a different approach. Original answer This is actually possible. But not directly, the way to do it is to create a second auth reference and use that to create users: var config = {apiKey: "apiKey", authDomain: "projectId.firebaseapp.com", databaseURL: "https://databaseName.firebaseio.com"}; var secondaryApp = firebase.initializeApp(config, "Secondary"); secondaryApp.auth().createUserWithEmailAndPassword(em, pwd).then(function(firebaseUser) { console.log("User " + firebaseUser.uid + " created successfully!"); //I don't know if the next statement is necessary secondaryApp.auth().signOut(); }); If you don't specify which firebase connection you use for an operation it will use the first one by default. Source for multiple app references. EDIT For the actual creation of a new user, it doesn't matter that there is nobody or someone else than the admin, authenticated on the second auth reference because for creating an account all you need is the auth reference itself. The following hasn't been tested but it is something to think about The thing you do have to think about is writing data to firebase. Common practice is that users can edit/update their own user info so when you use the second auth reference for writing this should work. But if you have something like roles or permissions for that user make sure you write that with the auth reference that has the right permissions. In this case, the main auth is the admin and the second auth is the newly created user.
Update 20161108 - original answer below Firebase just released its firebase-admin SDK, which allows server-side code for this and other common administrative use-cases. Read the installation instructions and then dive into the documentation on creating users. original answer This is currently not possible. Creating an Email+Password user automatically signs that new user in.
I just created a Firebase Function that triggers when a Firestore document is Created (with rules write-only to admin user). Then use admin.auth().createUser() to create the new user properly. export const createUser = functions.firestore .document('newUsers/{userId}') .onCreate(async (snap, context) => { const userId = context.params.userId; const newUser = await admin.auth().createUser({ disabled: false, displayName: snap.get('displayName'), email: snap.get('email'), password: snap.get('password'), phoneNumber: snap.get('phoneNumber') }); // You can also store the new user in another collection with extra fields await admin.firestore().collection('users').doc(newUser.uid).set({ uid: newUser.uid, email: newUser.email, name: newUser.displayName, phoneNumber: newUser.phoneNumber, otherfield: snap.get('otherfield'), anotherfield: snap.get('anotherfield') }); // Delete the temp document return admin.firestore().collection('newUsers').doc(userId).delete(); }); You can Algo use functions.https.onCall() exports.createUser= functions.https.onCall((data, context) => { const uid = context.auth.uid; // Authorize as you want // ... do the same logic as above }); calling it. const createUser = firebase.functions().httpsCallable('createUser'); createUser({userData: data}).then(result => { // success or error handling });
Swift 5: Simple Solution First store the current user in a variable called originalUser let originalUser = Auth.auth().currentUser Then, in the completion handler of creating a new user, use the updateCurrentUser method to restore the original user Auth.auth().updateCurrentUser(originalUser, completion: nil)
Here is a simple solution using web SDKs. Create a cloud function (https://firebase.google.com/docs/functions) import admin from 'firebase-admin'; import * as functions from 'firebase-functions'; const createUser = functions.https.onCall((data) => { return admin.auth().createUser(data) .catch((error) => { throw new functions.https.HttpsError('internal', error.message) }); }); export default createUser; Call this function from your app import firebase from 'firebase/app'; const createUser = firebase.functions().httpsCallable('createUser'); createUser({ email, password }) .then(console.log) .catch(console.error); Optionally, you can set user document information using the returned uid. createUser({ email, password }) .then(({ data: user }) => { return database .collection('users') .doc(user.uid) .set({ firstname, lastname, created: new Date(), }); }) .then(console.log) .catch(console.error);
I got André's very clever workaround working in Objective-C using the Firebase iOS SDK: NSString *plistPath = [[NSBundle mainBundle] pathForResource:#"GoogleService-Info" ofType:#"plist"]; FIROptions *secondaryAppOptions = [[FIROptions alloc] initWithContentsOfFile:plistPath]; [FIRApp configureWithName:#"Secondary" options:secondaryAppOptions]; FIRApp *secondaryApp = [FIRApp appNamed:#"Secondary"]; FIRAuth *secondaryAppAuth = [FIRAuth authWithApp:secondaryApp]; [secondaryAppAuth createUserWithEmail:user.email password:user.password completion:^(FIRUser * _Nullable user, NSError * _Nullable error) { [secondaryAppAuth signOut:nil]; }];
Update for Swift 4 I have tried a few different options to create multiple users from a single account, but this is by far the best and easiest solution. Original answer by Nico First Configure firebase in your AppDelegate.swift file func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. FirebaseApp.configure() FirebaseApp.configure(name: "CreatingUsersApp", options: FirebaseApp.app()!.options) return true } Add the following code to action where you are creating the accounts. if let secondaryApp = FirebaseApp.app(name: "CreatingUsersApp") { let secondaryAppAuth = Auth.auth(app: secondaryApp) // Create user in secondary app. secondaryAppAuth.createUser(withEmail: email, password: password) { (user, error) in if error != nil { print(error!) } else { //Print created users email. print(user!.email!) //Print current logged in users email. print(Auth.auth().currentUser?.email ?? "default") try! secondaryAppAuth.signOut() } } } }
You can use firebase function for add users. const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); const cors = require('cors')({ origin: true, }); exports.AddUser = functions.https.onRequest(( req, res ) => { // Grab the text parameter. cors( req, res, () => { let email = req.body.email; let passwd = req.body.passwd; let role = req.body.role; const token = req.get('Authorization').split('Bearer ')[1]; admin.auth().verifyIdToken(token) .then( (decoded) => { // return res.status(200).send( decoded ) return creatUser(decoded); }) .catch((err) => { return res.status(401).send(err) }); function creatUser(user){ admin.auth().createUser({ email: email, emailVerified: false, password: passwd, disabled: false }) .then((result) => { console.log('result',result); return res.status(200).send(result); }).catch((error) => { console.log(error.message); return res.status(400).send(error.message); }) } }); }); CreateUser(){ //console.log('Create User') this.submitted = true; if (this.myGroup.invalid) { return; } let Email = this.myGroup.value.Email; let Passwd = this.myGroup.value.Passwd; let Role = 'myrole'; let TechNum = this.myGroup.value.TechNum; let user = JSON.parse(localStorage.getItem('user')); let role = user.role; let AdminUid = user.uid; let authToken = user.stsTokenManager.accessToken; let httpHeaders = new HttpHeaders().set('Authorization', 'Bearer ' + authToken); let options = { headers: httpHeaders }; let params = { email:Email,passwd:Passwd,role:Role }; this.httpClient.post('https://us-central1-myproject.cloudfunctions.net/AddUser', params, options) .subscribe( val => { //console.log('Response from cloud function', val ); let createdUser:any = val; //console.log(createdUser.uid); const userRef: AngularFirestoreDocument<any> = this.afs.doc(`users/${createdUser.uid}`); const userUpdate = { uid: createdUser.uid, email: createdUser.email, displayName: null, photoURL: null, emailVerified: createdUser.emailVerified, role: Role, TechNum:TechNum, AccountAccess:this.AccountAccess, UserStatus:'open', OwnerUid:AdminUid, OwnerUidRole:role, RootAccountAccess:this.RootAccountAccess } userRef.set(userUpdate, { merge: false }); this.toastr.success('Success, user add','Success'); this.myGroup.reset(); this.submitted = false; }, err => { console.log('HTTP Error', err.error) this.toastr.error(err.error,'Error') }, () => console.log('HTTP request completed.') ); }
On the web, this is due to unexpected behavior when you call createUserWithEmailAndPassword out of the registration context; e.g. inviting a new user to your app by creating a new user account. Seems like, createUserWithEmailAndPassword method triggers a new refresh token and user cookies are updated too. (This side-effect is not documented) Here is a workaround for Web SDK: After creating the new user; firebase.auth().updateCurrentUser (loggedInUser.current) provided that you initiate loggedInUser with the original user beforehand.
Hey i had similar problem ,trying to create users through admin , as it is not possible to signUp user without signIn ,I created a work around ,adding it below with steps Instead of signup create a node in firebase realtime db with email as key (firebase do not allow email as key so I have created a function to generate key from email and vice versa, I will attach the functions below) Save a initial password field while saving user (can even hash it with bcrypt or something, if you prefer though it will be used one time only) Now Once user try to login check if any node with that email (generate key from email) exist in the db and if so then match the password provided. If the password matched delete the node and do authSignUpWithEmailandPassword with provided credentials. User is registered successfully //Sign In firebaseDB.child("users").once("value", (snapshot) => { const users = snapshot.val(); const userKey = emailToKey(data.email); if (Object.keys(users).find((key) => key === userKey)) { setError("user already exist"); setTimeout(() => { setError(false); }, 2000); setLoading(false); } else { firebaseDB .child(`users`) .child(userKey) .set({ email: data.email, initPassword: data.password }) .then(() => setLoading(false)) .catch(() => { setLoading(false); setError("Error in creating user please try again"); setTimeout(() => { setError(false); }, 2000); }); } }); //Sign Up signUp = (data, setLoading, setError) => { auth .createUserWithEmailAndPassword(data.email, data.password) .then((res) => { const userDetails = { email: res.user.email, id: res.user.uid, }; const key = emailToKey(data.email); app .database() .ref(`users/${key}`) .remove() .then(() => { firebaseDB.child("users").child(res.user.uid).set(userDetails); setLoading(false); }) .catch(() => { setLoading(false); setError("error while registering try again"); setTimeout(() => setError(false), 4000); }); }) .catch((err) => { setLoading(false); setError(err.message); setTimeout(() => setError(false), 4000); }); }; //Function to create a valid firebase key from email and vice versa const emailToKey = (email) => { //firebase do not allow ".", "#", "$", "[", or "]" let key = email; key = key.replace(".", ",0,"); key = key.replace("#", ",1,"); key = key.replace("$", ",2,"); key = key.replace("[", ",3,"); key = key.replace("]", ",4,"); return key; }; const keyToEmail = (key) => { let email = key; email = email.replace(",0,", "."); email = email.replace(",1,", "#"); email = email.replace(",2,", "$"); email = email.replace(",3,", "["); email = email.replace(",4,", "]"); return email; };
If you want to do it in your front end create a second auth reference use it to create other users and sign out and delete that reference. If you do it this way you won't be signed out when creating a new user and you won't get the error that the default firebase app already exists. const createOtherUser =()=>{ var config = { //your firebase config }; let secondaryApp = firebase.initializeApp(config, "secondary"); secondaryApp.auth().createUserWithEmailAndPassword(email, password).then((userCredential) => { console.log(userCredential.user.uid); }).then(secondaryApp.auth().signOut() ) .then(secondaryApp.delete() ) }
Update 19.05.2022 - using #angular/fire (latest available = v.7.3.0) If you are not using firebase directly in your app, but use e.g. #angular/fire for auth purposes only, you can use the same approach as suggested earlier as follows with the #angular/fire library: import { Auth, getAuth, createUserWithEmailAndPassword } from '#angular/fire/auth'; import { deleteApp, initializeApp } from '#angular/fire/app'; import { firebaseConfiguration } from '../config/app.config'; // <-- Your project's configuration here. const tempApp = initializeApp(firebaseConfiguration, "tempApp"); const tempAppAuth = getAuth(tempApp); await createUserWithEmailAndPassword(tempAppAuth, email, password) .then(async (newUser) => { resolve( () ==> { // Do something, e.g. add user info to database }); }) .catch(error => reject(error)) .finally( () => { tempAppAuth.signOut() .then( () => deleteApp(tempApp)); });
The Swift version: FIRApp.configure() // Creating a second app to create user without logging in FIRApp.configure(withName: "CreatingUsersApp", options: FIRApp.defaultApp()!.options) if let secondaryApp = FIRApp(named: "CreatingUsersApp") { let secondaryAppAuth = FIRAuth(app: secondaryApp) secondaryAppAuth?.createUser(...) }
Here is a Swift 3 adaptaion of Jcabrera's answer : let bundle = Bundle.main let path = bundle.path(forResource: "GoogleService-Info", ofType: "plist")! let options = FIROptions.init(contentsOfFile: path) FIRApp.configure(withName: "Secondary", options: options!) let secondary_app = FIRApp.init(named: "Secondary") let second_auth = FIRAuth(app : secondary_app!) second_auth?.createUser(withEmail: self.username.text!, password: self.password.text!) { (user,error) in print(user!.email!) print(FIRAuth.auth()?.currentUser?.email ?? "default") }
If you are using Polymer and Firebase (polymerfire) see this answer: https://stackoverflow.com/a/46698801/1821603 Essentially you create a secondary <firebase-app> to handle the new user registration without affecting the current user.
Android solution (Kotlin): 1.You need FirebaseOptions BUILDER(!) for setting api key, db url, etc., and don't forget to call build() at the end 2.Make a secondary auth variable by calling FirebaseApp.initializeApp() 3.Get instance of FirebaseAuth by passing your newly created secondary auth, and do whatever you want (e.g. createUser) // 1. you can find these in your project settings under general tab val firebaseOptionsBuilder = FirebaseOptions.Builder() firebaseOptionsBuilder.setApiKey("YOUR_API_KEY") firebaseOptionsBuilder.setDatabaseUrl("YOUR_DATABASE_URL") firebaseOptionsBuilder.setProjectId("YOUR_PROJECT_ID") firebaseOptionsBuilder.setApplicationId("YOUR_APPLICATION_ID") //not sure if this one is needed val firebaseOptions = firebaseOptionsBuilder.build() // indeterminate progress dialog *ANKO* val progressDialog = indeterminateProgressDialog(resources.getString(R.string.progressDialog_message_registering)) progressDialog.show() // 2. second auth created by passing the context, firebase options and a string for secondary db name val newAuth = FirebaseApp.initializeApp(this#ListActivity, firebaseOptions, Constants.secondary_db_auth) // 3. calling the create method on our newly created auth, passed in getInstance FirebaseAuth.getInstance(newAuth).createUserWithEmailAndPassword(email!!, password!!) .addOnCompleteListener { it -> if (it.isSuccessful) { // 'it' is a Task<AuthResult>, so we can get our newly created user from result val newUser = it.result.user // store wanted values on your user model, e.g. email, name, phonenumber, etc. val user = User() user.email = email user.name = name user.created = Date().time user.active = true user.phone = phone // set user model on /db_root/users/uid_of_created_user/, or wherever you want depending on your structure FirebaseDatabase.getInstance().reference.child(Constants.db_users).child(newUser.uid).setValue(user) // send newly created user email verification link newUser.sendEmailVerification() progressDialog.dismiss() // sign him out FirebaseAuth.getInstance(newAuth).signOut() // DELETE SECONDARY AUTH! thanks, Jimmy :D newAuth.delete() } else { progressDialog.dismiss() try { throw it.exception!! // catch exception for already existing user (e-mail) } catch (e: FirebaseAuthUserCollisionException) { alert(resources.getString(R.string.exception_FirebaseAuthUserCollision), resources.getString(R.string.alertDialog_title_error)) { okButton { isCancelable = false } }.show() } } }
For Android, i suggest a simpler way to do it, without having to provide api key, application id...etc by hand by just using the FirebaseOptions of the default instance. val firebaseDefaultApp = Firebase.auth.app val signUpAppName = firebaseDefaultApp.name + "_signUp" val signUpApp = try { FirebaseApp.initializeApp( context, firebaseDefaultApp.options, signUpAppName ) } catch (e: IllegalStateException) { // IllegalStateException is throw if an app with the same name has already been initialized. FirebaseApp.getInstance(signUpAppName) } // Here is the instance you can use to sign up without triggering auth state on the default Firebase.auth val signUpFirebaseAuth = Firebase.auth(signUpApp) How to use ? signUpFirebaseAuth .createUserWithEmailAndPassword(email, password) .addOnSuccessListener { // Optional, you can send verification email here if you need // As soon as the sign up with sign in is over, we can sign out the current user firebaseAuthSignUp.signOut() } .addOnFailureListener { // Log }
My solution to this question is to store the User Name/Email and password in a static class and then add a new user log out the new user and immediately log in as the admin user(id pass you saved). Works like a charm for me :D
This is a version for Kotlin: fun createUser(mail: String, password: String) { val opts = FirebaseOptions.fromResource(requireContext()) if (opts == null) return val app = Firebase.initialize(requireContext(), opts, "Secondary") FirebaseAuth.getInstance(app) .createUserWithEmailAndPassword(mail, password) .addOnSuccessListener { app.delete() doWhateverWithAccount(it) }.addOnFailureListener { app.delete() showException(it) } } It uses the configuration from your default Firebase application instance, just under a different name. It also deletes the newly created instance afterwards, so you can call this multiple times without any exception about already existing Secondary application.
How to write to firebase for a specific user?
I'm super new to firebase and I was looking at https://firebase.google.com/docs/auth I was able to do sign up and log in with firebase where I'm adding the user info into the authentication ->users. And then after you log in it redirects to a form. The form currently adds the data I want into the real-time database (I got that to work before I did the sign-up and log in) but my problem is that the data isn't attached/under the account it's logged in with. So right now It's just a bunch of random data and I don't know what data is whose. I looked around and haven't been able to find anything on how to make the two connect. Below I included my function for logging in and my function to update the database. Thank you for any help! function loggingIn() { var notyf = new Notyf(); console.log("Logging In"); var email = document.getElementById("emailVal").value; var password = document.getElementById("passVal").value; console.log("Email: ", email, " Password: ", password); const promise = firebase.auth().signInWithEmailAndPassword(email, password); firebase.auth().onAuthStateChanged(function(user) { if (user) { // User is signed in. notyf.success('Logged in successfully'); questionPage() } else { promise.catch(e => alert(e.message)); } }); } function setup(){ //initialization and firebaseConfig is here as well dataMessage = firebase.database().ref('PersonData'); } function writeUserData(activity, hours) { let newdataMessage = dataMessage.push(); newdataMessage.set({ funactivity: activity, sleep: hours }); } The solution that I found is as followed: function writeUserData(activity, hours) { var userId = firebase.auth().currentUser.uid; dataMessage = firebase.database().ref('PersonData/'+userId); let newdataMessage = dataMessage.push(); newdataMessage.set({ funactivity: activity, sleep: hours }); } Using firebase.auth().currentUser.uid; let me add the data to the current user.
You can build out your post route to take in dynamic data, here's an example: let postMessageRef = firebase.database().ref(`messages/${path}`); in this case, you'd dynamically change the path to whatever the username is/whatever your criteria are Then this does the actual post postMessageRef .set({ message: message, from: userName }) .catch((err) => console.log(err)) edit I'll read better next time... let userName = "placeholderToPreventDBWipes"; const onAuthStateChanged = (user) => { userName = user; }; ~~In this case I used useEffect, but you can throw this in your .then()~~ useEffect(() => { const subscriber = auth().onAuthStateChanged(onAuthStateChanged); return subscriber; //unsub # unmount }, []);
set display name while creating user with firebase
I have a react app with which I want to handle authentication with firebase. My code successfully signs up and logs in but i am trying to add extra information on sign up but i have not been successful. I have tried answers [here]: Firebase v3 updateProfile Method and [here]: Firebase user.updateProfile({...}) not working in React App But they don't seem to work. Below is my code const SignUp = ({ history }) => { const handleSignUp = useCallback( async event => { event.preventDefault(); const { email, password } = event.target.elements; try { let cred = await app .auth() .createUserWithEmailAndPassword(email.value, password.value); await cred.user.updateProfile({ displayName: 'hello' }); history.push('/'); } catch (error) { console.log(error); } }, [history] ); Please how do i fix this because currently on the email and username sets? Thanks
In order to change user profile you should use firebase.auth().onAuthStateChanged() function, as follows: firebase.auth().onAuthStateChanged(function(user) { if (user) { // User is signed in. } else { // No user is signed in. } }); Then you can get others user properties. Here you can find all info you need. https://firebase.google.com/docs/auth/web/manage-users. Hope it helps.