@@ -6,11 +6,12 @@ import { useKumiteStore } from "./store.js";
6
6
import { useRouter } from "vue-router" ;
7
7
8
8
import LoginOptions from "./login-providers.js" ;
9
+ import Logout from "./login-logout.js" ;
9
10
10
11
export default {
11
- // https://vuejs.org/guide/components/registration#local-registration
12
12
components : {
13
13
LoginOptions,
14
+ Logout,
14
15
} ,
15
16
props : {
16
17
logout : {
@@ -28,80 +29,10 @@ export default {
28
29
} ,
29
30
setup ( props ) {
30
31
const store = useKumiteStore ( ) ;
31
- const router = useRouter ( ) ;
32
32
33
33
store . loadUser ( ) ;
34
34
35
- const csrfToken = ref ( { } ) ;
36
- const fetchCsrfToken = async function ( ) {
37
- try {
38
- const response = await fetch ( `/api/login/v1/csrf` ) ;
39
- if ( ! response . ok ) {
40
- throw new Error ( "Rejected request for logout" ) ;
41
- }
42
-
43
- const json = await response . json ( ) ;
44
- const csrfHeader = json . header ;
45
- console . log ( "csrf header" , csrfHeader ) ;
46
-
47
- const freshCrsfToken = response . headers . get ( csrfHeader ) ;
48
- if ( ! freshCrsfToken ) {
49
- throw new Error ( "Invalid csrfToken" ) ;
50
- }
51
- console . debug ( "csrf" , freshCrsfToken ) ;
52
-
53
- csrfToken . value = { header : csrfHeader , token : freshCrsfToken } ;
54
- } catch ( e ) {
55
- console . error ( "Issue on Network: " , e ) ;
56
- }
57
- } ;
58
-
59
- const doLogout = function ( ) {
60
- console . info ( "Logout" ) ;
61
- async function fetchFromUrl ( url ) {
62
- // https://www.baeldung.com/spring-security-csrf
63
- // If we relied on Cookie, `.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())` we could get the csrfToken with:
64
- // const csrfToken = document.cookie.replace(/(?:(?:^|.*;\s*)XSRF-TOKEN\s*\=\s*([^;]*).*$)|^.*$/, '$1');
65
-
66
- // https://stackoverflow.com/questions/60265617/how-do-you-include-a-csrf-token-in-a-vue-js-application-with-a-spring-boot-backe
67
- const headers = { [ csrfToken . value . header ] : csrfToken . value . token } ;
68
-
69
- try {
70
- const response = await fetch ( url , {
71
- method : "POST" ,
72
- headers : headers ,
73
-
74
- // https://stackoverflow.com/questions/39735496/redirect-after-a-fetch-post-call
75
- // https://github.com/whatwg/fetch/issues/601#issuecomment-502667208
76
- redirect : "follow" ,
77
- } ) ;
78
- if ( ! response . ok ) {
79
- throw new Error ( "Rejected request for logout" ) ;
80
- }
81
-
82
- const json = await response . json ( ) ;
83
-
84
- // We we can not intercept 3XX to extract the Location header, we introduced an API providing the Location as body of a 2XX.
85
- const logoutHtmlRoute = json [ "Location" ] ;
86
-
87
- console . info ( "Redirect to logout route" , logoutHtmlRoute ) ;
88
-
89
- router . push ( logoutHtmlRoute ) ;
90
-
91
- // We force reloading the page to take in account the removed SESSION
92
- // There should be a cleaner way to do it, without full-reload
93
- router . go ( 0 ) ;
94
- } catch ( e ) {
95
- console . error ( "Issue on Network: " , e ) ;
96
- }
97
- }
98
-
99
- fetchCsrfToken ( ) . then ( ( ) => {
100
- fetchFromUrl ( `/logout` ) ;
101
- } ) ;
102
- } ;
103
-
104
- return { doLogout } ;
35
+ return { } ;
105
36
} ,
106
37
template : /* HTML */ `
107
38
<div v-if="needsToLogin">
@@ -111,9 +42,7 @@ export default {
111
42
</div>
112
43
</div>
113
44
<div v-else>
114
- Welcome {{user.raw.name}}.
115
-
116
- <button class="btn btn-danger" @click="doLogout">Logout</button>
45
+ Welcome {{user.raw.name}}. <Logout />
117
46
</div>
118
47
` ,
119
48
} ;
0 commit comments