Skip to content

Commit f0aa6f6

Browse files
committed
resolved critical issues handling expired tokens
1 parent 036ef13 commit f0aa6f6

File tree

6 files changed

+63
-24
lines changed

6 files changed

+63
-24
lines changed

src/App.vue

+13-5
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,21 @@
55
</template>
66

77
<script>
8+
import Vue from "vue";
9+
import interceptor from "./interceptor";
10+
811
export default {
912
created: function() {
10-
this.$http.interceptors.response.use(undefined, function(err) {
11-
if (err.status === 401 && err.config && !err.config.__isRetryRequest) {
12-
this.$store.dispatch("logout");
13-
}
14-
Promise.reject(err);
13+
this.$http.interceptors.response.eject(interceptor);
14+
this.$http.interceptors.response.use(undefined, err => {
15+
return new Promise((resolve, reject) => {
16+
let res = err.response;
17+
if (res.status === 200) resolve();
18+
if (res.status === 401 && res.config && !res.config.__isRetryRequest) {
19+
Vue.nextTick(() => this.$store.dispatch("logout"));
20+
}
21+
reject(err);
22+
});
1523
});
1624
}
1725
};

src/components/Trophies.vue

+14
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,14 @@ export default {
183183
Vue.set(this.filters, field.key, null);
184184
}
185185
});
186+
this.fetchTags();
186187
if (this.$route.query.target) {
187188
this.collectKills();
188189
}
189190
},
190191
watch: {
191192
$route: function() {
193+
this.fetchTags();
192194
if (this.$route.query.target) {
193195
this.collectKills();
194196
}
@@ -272,6 +274,18 @@ export default {
272274
let end = this.pickerEnd;
273275
this.filters[field].start = start ? new Date(start) : null;
274276
this.filters[field].end = end ? new Date(end) : null;
277+
},
278+
fetchTags: function() {
279+
// handle tag fetches
280+
this.$http
281+
.get(`${process.env.VUE_APP_API_URL}/profile`)
282+
.then(res => {
283+
this.$store.dispatch("updateTags", res.data);
284+
})
285+
.catch(err => {
286+
console.log(err);
287+
this.$store.dispatch("updateTags", []);
288+
});
275289
}
276290
}
277291
};

src/interceptor.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import axios from "axios";
2+
3+
const interceptor = axios.interceptors.response.use(undefined, function(err) {
4+
return new Promise(function(resolve, reject) {
5+
let res = err.response;
6+
if (res.status === 200) resolve();
7+
if (res.status === 401 && res.config && !res.config.__isRetryRequest) {
8+
localStorage.removeItem("token");
9+
delete axios.defaults.headers.common["Authorization"];
10+
}
11+
reject(err);
12+
});
13+
});
14+
15+
export default interceptor;

src/main.js

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import App from "./App.vue";
88
import { createStore } from "./store";
99
import router from "./router";
1010
import axios from "axios";
11+
import "./interceptor";
1112
import VueAxios from "vue-axios";
1213
import { library } from "@fortawesome/fontawesome-svg-core";
1314
import {

src/store.js

+15-17
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,22 @@ export function createStore(initialState) {
6868
},
6969
actions: {
7070
login: (context, promise) => {
71-
return new Promise((resolve, reject) => {
72-
promise
73-
.then(res => {
74-
localStorage.setItem("token", res.data.token);
75-
axios.defaults.headers.common[
76-
"Authorization"
77-
] = `Bearer ${res.data.token}`;
78-
context.commit("authenticated", {
79-
token: res.data.token,
80-
user: res.data.user
81-
});
82-
resolve(res);
83-
})
84-
.catch(err => {
85-
context.commit("denied");
86-
reject(err);
71+
return promise
72+
.then(res => {
73+
localStorage.setItem("token", res.data.token);
74+
axios.defaults.headers.common[
75+
"Authorization"
76+
] = `Bearer ${res.data.token}`;
77+
context.commit("authenticated", {
78+
token: res.data.token,
79+
user: res.data.user
8780
});
88-
});
81+
return res;
82+
})
83+
.catch(err => {
84+
context.commit("denied");
85+
throw err;
86+
});
8987
},
9088
register: (context, promise) => {
9189
return new Promise((resolve, reject) => {

src/views/Search.vue

+5-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
<template v-slot:button-content>
1818
<em>{{ username }}</em>
1919
</template>
20-
<b-dropdown-item href="#">Profile</b-dropdown-item>
20+
<b-dropdown-item v-b-modal.modal-profile>Profile</b-dropdown-item>
21+
<profile :username="username"></profile>
2122
<b-dropdown-item-button @click="logout">
2223
Sign out
2324
</b-dropdown-item-button>
@@ -32,12 +33,14 @@
3233
// @ is an alias to /src
3334
import Hunter from "@/components/Hunter.vue";
3435
import Trophies from "@/components/Trophies.vue";
36+
import Profile from "@/components/Profile.vue";
3537
3638
export default {
3739
name: "search",
3840
components: {
3941
Hunter,
40-
Trophies
42+
Trophies,
43+
Profile
4144
},
4245
computed: {
4346
username: function() {

0 commit comments

Comments
 (0)