Skip to content
Snippets Groups Projects
Commit 9bf9b456 authored by Embruch, Gerd's avatar Embruch, Gerd
Browse files

enables jwt refresh on every api call

parent 048eb4e5
No related branches found
No related tags found
No related merge requests found
...@@ -26,11 +26,22 @@ function AuthState({ children }) { ...@@ -26,11 +26,22 @@ function AuthState({ children }) {
// ### LOGIN // ### LOGIN
async function login(credentials) { async function login(credentials) {
const result = await api.post( let result = {};
try {
result = await api.post(
'/users/login', '/users/login',
credentials, credentials,
{ withCredentials: true } { withCredentials: true }
); );
} catch (error) {
result = await api.post(
'/users/adminlogin',
credentials,
{ withCredentials: true }
);
// try to match output with normal user
result.data.record = { ...result.data.admin, isAdmin: true };
}
// set current user to login and merge accessToken into currentUser // set current user to login and merge accessToken into currentUser
dispatchCurrentUser({ type: USER_ACTIONS.SET, payload: { ...result.data.record } }); dispatchCurrentUser({ type: USER_ACTIONS.SET, payload: { ...result.data.record } });
setAccessToken(result.data.token); setAccessToken(result.data.token);
......
...@@ -34,7 +34,7 @@ function Login() { ...@@ -34,7 +34,7 @@ function Login() {
// ### PREPARE FORM // ### PREPARE FORM
const methods = useForm({ const methods = useForm({
resolver: zodResolver(schema), resolver: zodResolver(schema),
mode: 'onBlur', mode: 'onSubmit',
defaultValues: { defaultValues: {
email: '', email: '',
password: '' password: ''
...@@ -106,7 +106,7 @@ function Login() { ...@@ -106,7 +106,7 @@ function Login() {
<div className="mt-4 flex justify-between"> <div className="mt-4 flex justify-between">
<Link to="/reset_password">Reset Password</Link> <Link to="/reset_password">Reset Password</Link>
<Link to="/signup">Create an account</Link> <Link to="/signup">Create account</Link>
</div> </div>
</> </>
); );
......
...@@ -38,7 +38,7 @@ function ResetPasswordForm() { ...@@ -38,7 +38,7 @@ function ResetPasswordForm() {
// ### PREPARE FORM // ### PREPARE FORM
const methods = useForm({ const methods = useForm({
resolver: zodResolver(schema), resolver: zodResolver(schema),
mode: 'onBlur', mode: 'onSubmit',
defaultValues: { defaultValues: {
token: token, token: token,
} }
......
...@@ -43,7 +43,7 @@ function Signup() { ...@@ -43,7 +43,7 @@ function Signup() {
// ### PREPARE FORM // ### PREPARE FORM
const methods = useForm({ const methods = useForm({
resolver: zodResolver(schema), resolver: zodResolver(schema),
mode: 'onBlur', mode: 'onSubmit',
defaultValues: { defaultValues: {
name: '', name: '',
username: '', username: '',
......
...@@ -29,40 +29,21 @@ api.interceptors.request.use( ...@@ -29,40 +29,21 @@ api.interceptors.request.use(
// ### RESPONSE INTERCEPTOR // ### RESPONSE INTERCEPTOR
// refreshes accessToken if needed // refreshes accessToken if needed
api.interceptors.response.use( api.interceptors.response.use(
(res) => { async (res) => {
switch (res.config.url) {
case '/users/refreshjwt':
case '/users/logout':
case '/users/login':
return res; return res;
}, default:
async (err) => { const refresh = await api.get(
// console.log('JWT error: ', err);
// save original request config
const originalConfig = err.config;
// if access denied and not a retry already
// BUG: Infinit loop because _retry isn't set at runtime
// console.log('originalConfig: ',originalConfig);
// console.log('originalConfig: ',JSON.stringify(originalConfig));
if (originalConfig && err?.response?.status === 403 && originalConfig._retry !== true) {
// patch config to remember it's a retry
originalConfig._retry = true;
console.log('trying to refresh the accessToken and rerun the request');
// console.log('retry', err.code, originalConfig._retry);
// refresh access token
try {
const result = await api.get(
'/users/refreshjwt', '/users/refreshjwt',
{}, {},
{ withCredentials: true } { withCredentials: true }
); );
// TODO: don't store accessToken in localStorage, keep in memory only localStorage.setItem("accessToken", JSON.stringify(refresh.data.token));
localStorage.setItem("accessToken", JSON.stringify(result.data.accessToken)); return res;
// run retry
return api(originalConfig);
} catch (error) {
return Promise.reject(error);
}
} }
return Promise.reject(err);
} }
); );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment