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, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "client",
"version": "0.1.0", "version": "0.1.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {

View File

@@ -19,9 +19,14 @@ export function AuthProvider({children}) {
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
axios axios
.post('/auth/register', formData) .post('/auth/register', formData)
.then(({data: {data, token}}) => { .then(({
setAccount(data) data: {
setToken(token) data: accountData,
token: accessToken,
},
}) => {
setAccount(accountData)
setToken(accessToken)
setIsLoggedIn(true) setIsLoggedIn(true)
resolve(true) resolve(true)
}) })
@@ -35,9 +40,14 @@ export function AuthProvider({children}) {
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
axios axios
.post('/auth/login', formData) .post('/auth/login', formData)
.then(({data: {data, token}}) => { .then(({
setAccount(data) data: {
setToken(token) data: accountData,
token: accessToken,
},
}) => {
setAccount(accountData)
setToken(accessToken)
setIsLoggedIn(true) setIsLoggedIn(true)
resolve(true) resolve(true)
}) })
@@ -53,12 +63,21 @@ export function AuthProvider({children}) {
setToken(null) setToken(null)
} }
const getAccount = async () => { const loginWithToken = async () => {
try { try {
const headers = {headers: {authorization: `Bearer ${token}`}} const {
const response = await axios.get('/auth/account', headers) data: {
data: accountData,
token: accessToken,
},
} = await axios.get('/auth/login', {
headers: {
authorization: `Bearer ${token}`,
},
})
setAccount(response.data.data) setAccount(accountData)
setToken(accessToken)
setIsLoggedIn(true) setIsLoggedIn(true)
} catch (error) { } catch (error) {
console.error(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, // 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) // if true, it will then ask the backend for the account information (and will get them if the token hasn't expired)
useEffect(() => { useEffect(() => {
if (!isLoggedIn && !account && token) getAccount() if (!isLoggedIn && !account && token) loginWithToken()
}, [isLoggedIn, account, token]) // eslint-disable-line react-hooks/exhaustive-deps }, [isLoggedIn, account, token]) // eslint-disable-line react-hooks/exhaustive-deps
return ( 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, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "server",
"version": "0.1.0", "version": "0.1.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {

View File

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