fix: login with token returns new token
This commit is contained in:
1
client/package-lock.json
generated
1
client/package-lock.json
generated
@@ -5,6 +5,7 @@
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "client",
|
||||
"version": "0.1.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
25
server/controllers/auth/login-with-token.js
Normal file
25
server/controllers/auth/login-with-token.js
Normal 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
|
||||
1
server/package-lock.json
generated
1
server/package-lock.json
generated
@@ -5,6 +5,7 @@
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "server",
|
||||
"version": "0.1.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user