fix: login with token returns new token

This commit is contained in:
Ben Elferink
2021-10-27 19:06:47 +03:00
parent e9e8584d82
commit 75979bce3d
6 changed files with 62 additions and 36 deletions

View File

@@ -5,6 +5,7 @@
"requires": true,
"packages": {
"": {
"name": "client",
"version": "0.1.0",
"license": "ISC",
"dependencies": {

View File

@@ -1,4 +1,4 @@
import {createContext, useContext, useState, useEffect} from 'react'
import { createContext, useContext, useState, useEffect } from 'react'
import axios from '../api'
// init context
@@ -10,7 +10,7 @@ export function useAuth() {
}
// export the provider (handle all the logic here)
export function AuthProvider({children}) {
export function AuthProvider({ children }) {
const [isLoggedIn, setIsLoggedIn] = useState(false)
const [account, setAccount] = useState(null)
const [token, setToken] = useState(localStorage.getItem('token') || null)
@@ -19,9 +19,14 @@ export function AuthProvider({children}) {
new Promise((resolve, reject) => {
axios
.post('/auth/register', formData)
.then(({data: {data, token}}) => {
setAccount(data)
setToken(token)
.then(({
data: {
data: accountData,
token: accessToken,
},
}) => {
setAccount(accountData)
setToken(accessToken)
setIsLoggedIn(true)
resolve(true)
})
@@ -35,9 +40,14 @@ export function AuthProvider({children}) {
new Promise((resolve, reject) => {
axios
.post('/auth/login', formData)
.then(({data: {data, token}}) => {
setAccount(data)
setToken(token)
.then(({
data: {
data: accountData,
token: accessToken,
},
}) => {
setAccount(accountData)
setToken(accessToken)
setIsLoggedIn(true)
resolve(true)
})
@@ -53,12 +63,21 @@ export function AuthProvider({children}) {
setToken(null)
}
const getAccount = async () => {
const loginWithToken = async () => {
try {
const headers = {headers: {authorization: `Bearer ${token}`}}
const response = await axios.get('/auth/account', headers)
const {
data: {
data: accountData,
token: accessToken,
},
} = await axios.get('/auth/login', {
headers: {
authorization: `Bearer ${token}`,
},
})
setAccount(response.data.data)
setAccount(accountData)
setToken(accessToken)
setIsLoggedIn(true)
} catch (error) {
console.error(error)
@@ -80,7 +99,7 @@ export function AuthProvider({children}) {
// This "if" statement is "true" only when refreshed, or re-opened the browser,
// if true, it will then ask the backend for the account information (and will get them if the token hasn't expired)
useEffect(() => {
if (!isLoggedIn && !account && token) getAccount()
if (!isLoggedIn && !account && token) loginWithToken()
}, [isLoggedIn, account, token]) // eslint-disable-line react-hooks/exhaustive-deps
return (

View File

@@ -1,20 +0,0 @@
const Account = require('../../models/Account')
async function getAccount(request, response, next) {
try {
const {uid} = request.auth
// Get account from DB, existance not verified because we are already authorized at this point
const foundAccount = await Account.findOne({_id: uid}).select('-password')
response.status(200).json({
message: 'Account fetched',
data: foundAccount,
})
} catch (error) {
console.error(error)
response.status(500).send()
}
}
module.exports = getAccount

View File

@@ -0,0 +1,25 @@
const Account = require('../../models/Account')
const { signToken } = require('../../middlewares/jsonwebtoken')
async function loginWithToken(request, response, next) {
try {
const { uid } = request.auth
// Get account from DB, existance not verified because we are already authorized at this point
const foundAccount = await Account.findOne({ _id: uid }).select('-password')
// Generate access token
const token = signToken({ uid: foundAccount._id, role: foundAccount.role })
response.status(200).json({
message: 'Account fetched',
data: foundAccount,
token,
})
} catch (error) {
console.error(error)
response.status(500).send()
}
}
module.exports = loginWithToken

View File

@@ -5,6 +5,7 @@
"requires": true,
"packages": {
"": {
"name": "server",
"version": "0.1.0",
"license": "ISC",
"dependencies": {

View File

@@ -1,8 +1,8 @@
const express = require('express')
const {authorizeBearerToken} = require('../middlewares/jsonwebtoken')
const { authorizeBearerToken } = require('../middlewares/jsonwebtoken')
const register = require('../controllers/auth/register')
const login = require('../controllers/auth/login')
const getAccount = require('../controllers/auth/get-account')
const loginWithToken = require('../controllers/auth/login-with-token')
// initialize router
const router = express.Router()
@@ -14,6 +14,6 @@ router.post('/register', [], register)
router.post('/login', [], login)
// GET at path: http://localhost:8080/auth/account
router.get('/account', [authorizeBearerToken], getAccount)
router.get('/login', [authorizeBearerToken], loginWithToken)
module.exports = router