Authentication is something almost every modern web app needs. I've user Auth0 and Next Auth but Firebase seems to provide the easiest way to get authentication up and running.
Registering a Firebase App
Now we need to create a new project in firebase. Navigate to Firebase Console and click Add project

After creating this project and you are in the project console click on the Web icon to create a new web app. Follow the directions and copy the config which will look something like this.

After creating this project navigate to the authentication tab and click Get Started. Then click Google
Getting Started
npm install firebase
create a new folders in /src named /lib/auth. Inside this auth folder create a file index.js
first lets import what we need and initialize our constants
import {getAuth, GoogleAuthProvider, signInWithPopup, onAuthStateChanged} from 'firebase/auth'
import {initializeApp} from 'firebase/app'
import { createContext, useContext, useEffect, useState } from 'react'
const app = initializeApp({
apiKey: process.env.REACT_APP_apiKey,
authDomain: process.env.REACT_APP_authDomain,
projectId: process.env.REACT_APP_projectId,
storageBucket: process.env.REACT_APP_storageBucket,
messagingSenderId: process.env.REACT_APP_messagingSenderId,
appId: process.env.REACT_APP_appId
})
const auth = getAuth()
const googleProvider = new GoogleAuthProvider()
const UserContext = createContext()
We need to create a context provider so that we can access the user object in all components
/src/lib/auth/index.js
export const AuthProvider = ({children}) => {
const [user, setUser] = useState()
useEffect(() => {
onAuthStateChanged(auth, (user) => {
if(user) {
setUser(user)
} else {
setUser(undefined)
}
})
}, [])
return (
<UserContext.Provider value={user}>
{children}
</UserContext.Provider>
)
}
export const googleSignIn = () => {
signInWithPopup(auth, googleProvider)
}
onAuthStateChanged creates an observer for changes to the user's sign-in state.
Now lets wrap out base level components with this AuthProvider
index.js
ReactDOM.render(
<React.StrictMode>
<AuthProvider>
<App />
</AuthProvider>
</React.StrictMode>,
document.getElementById('root')
);
Finally lets create a signInGoogle, a signOut and a useAuth function
export const useAuth = () => {
return useContext(UserContext)
}
export const googleSignIn = () => {
signInWithPopup(auth, googleProvider)
.then(value => {})
.catch(reason => {console.error(reason)})
}
export const signOut = () => {
auth.signOut()
.then(value => {})
.catch(reason => {console.error(reason)})
}
now in our App.js we can use these functions
import {googleSignIn, signOut, useAuth} from './lib/auth'
function App() {
const user = useAuth()
return (
<div>
{JSON.stringify(user)}
<button onClick={(e) => {
e.preventDefault()
googleSignIn()
}}>Sign in with google</button>
<button onClick={(e) => {
e.preventDefault()
signOut()
}}>Sign Out</button>
</div>
);
}
export default App;
Full code here.
Top comments (0)