Fellows will be able to:
- Implement User Sign-up from their React apps.
- Store use data in state (Context) and display in the UI.
- Implement User Sing-in from their React apps.
- Use
jwt
andlocalStorage
to persist user log-in upon refresh of the page. - Implement Log-out.
We have two backend routes that allow us to register and log in:
POST
http://localhost:8000/users/register
POST
http://localhost:8000/users/login
Body: {"username": "ann", "password": "123"}
Our starter app has four pages:
/
for our Home Page/register
for our Register Page/login
for our Log-in Page/dashboard
for when a user logs in
It also has Context which stores users
and usersRobots
.
function submitForm(e){
console.log("submitting sign up form")
e.preventDefault()
const options = {
method: "POST",
headers: {
"Content-Type" : "application/json"
},
body: JSON.stringify({username, password, bio})
}
fetch("http://localhost:8000/users/register", options)
.then(res => res.json())
.then(data => {
console.log(data)
})
}
if(data.user){
setUser(data.user)
setUsersRobots(data.usersRobots)
}else{
alert(data.detail)
}
navigate('/dashboard')
if(res.status === 200){
return res.json()
}else{
alert("Incorrect username or password")
}
Backend Code
const jwt = require('jsonwebtoken');
const token = jwt.sign({ id: user.id }, 'sankofa');
res.send({token, user, usersRobots})
Frontend Code
localStorage.setItem("token", data.token) //when a user has been authenticated on the front-end
useEffect(() => {
const token = localStorage.getItem("token")
if(token){
console.log(token)
//make a fetch call with the token to decode which user is already authenticated.
}
}, [])
Backend Code
router.post('/verifytoken', verifyToken)
async function verifyToken(req, res){
const token = req.body.token
try {
const userId = jwt.verify(token, 'sankofa').id
const user = await UserModel.getSingleUserFromDB(userId)
const usersRobots = await UserModel.getUsersRobotsFromDB(userId)
res.send({token, user, usersRobots})
} catch(err) {
res.status(401).send("bad token")
}
}
Frontend Code
useEffect(() => {
const token = localStorage.getItem("token")
if(token){
fetch("http://localhost:8000/users/verifytoken", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({token})
}).then(res => res.json())
.then(data => {
setUser(data.user)
setUsersRobots(data.usersRobots)
})
}
}, [])
const handleLogout = (e) => {
console.log("Logging out")
setUser(null)
setUsersRobots([])
localStorage.removeItem("token")
navigate("/")
};