Vue 라우터에서 경로 입력 전에 인증 토큰이 유효한지 확인하는 중
사용 사례가 하는 것은 i i 、 i 、 i 、 i i 。vue-router
★★★★★★★★★★★★★★★★★」vuex
.그리고나서store
에는 를 contains contains a a가 되어 있습니다.user
라는 오브젝트null
이 확인되면, 유저는 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 유저에게, 에게, 유저가 송신됩니다.user
「」를 .JWT
: " " 에 되어 .user
해 보겠습니다 때 인증 것을 하면 그것을 to call "3" "3" "입니다).인증 토큰이 그때까지 기한이 지났다는 것을 고려하면, 그것을 확인하는 가장 좋은 방법은 무엇일까요(콜 필요).axios post
를 참조해 도 실시합니다.login
내에 나는 을 쓸 수 것을 .그래서류에서 할 수 있다.mounted
각 컴포넌트의 훅이지만 모든 컴포넌트를 반복해야 합니다.는 '아예'라는 말을 않아요.beforeEach
에게 을 표시할 수 에 네비게이션가드checking...
★★★★★★★★★★★★★★★★★」loading...
.
중 일을 , 하는 것은 상황을. 사실 이런 종류의 상황을 다루는 것은 매우 어렵지만, 당신은 그것을 추가할 수 있습니다.beforeEnter
보호 루트를 보호한 후 인증에 실패하면 리다이렉트합니다.
const guard = function(to, from, next) {
// check for valid auth token
axios.get('/api/checkAuthToken').then(response => {
// Token is valid, so continue
next();
}).catch(error => {
// There was an error so redirect
window.location.href = "/login";
})
};
그런 다음 경로에서 다음을 수행할 수 있습니다.
{
path: '/dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
guard(to, from, next);
}
},
location.href
router.push
csrf csrf csrf csrf csrf_csrf csrf csrf csrf_csrf csrf crf crf crf crf crf crf
다른 문제는 사용자가 경로를 변경하지 않고 페이지와 대화하려고 하는 경우(즉, 버튼을 클릭하여 401 응답을 받는 경우)입니다. 위해서는, 각각의 , 가장 할 수 .axios
하여 '접속하다'로 login
응답을했을 때.
가드 체크 중에 로딩 스피너를 추가하는 것과 관련하여 vuex 저장소에 로딩 플래그를 추가한 후 라우터에 스토어를 Import할 수 있습니다.솔직히 말씀드리면, 괜찮은 프로덕션 서버에서는 체크가 너무 빨리 이루어지기 때문에 사용자가 볼 수 없을 것 같습니다.
Vue 먹어봐.JS 믹스인
하고, 「」에서 사용할 수 .Vue.use(myMixin)
컴포넌트가 이을 상속합니다. - 모든 가 이 믹스인을 상속합니다.「」를하는 mounted
더 나을 것이다.activated
믹스인에 걸면 모든 컴포넌트에서 호출됩니다.
할 수 것을 할 수 . - 컴포넌트가 할 수 있는 모든 것을 사용할 수 있습니다.this
는 컴포넌트를 가리킵니다.또한 컴포넌트 자체도 후크를 정의하는 경우 컴포넌트 자체 후크 전에 동일한 유형의 믹스인 후크가 실행됩니다.
또는 단일 최상위 로그인 구성 요소를 사용해 보십시오.
조금 다른 솔루션을 사용했습니다.로그인 관련 모든 것을 처리하는 단일 컴포넌트가 있습니다.이 컴포넌트는 부모 index.html의 라우터 뷰 외부에 존재합니다.이 컴포넌트는 항상 활성화 되어 있으며 div router 뷰를 숨기고 로드 메시지 또는 로그인 화면을 오버레이할 수 있습니다.인트라넷 어플리케이션의 경우 이 컴포넌트는 브라우저가 열려 있는 한 폴링을 사용하여 세션을 유지합니다.
이 컴포넌트에 라우터 내비게이션을 로드할 수 있습니다.- 라우터 내비게이션을 트리거하는 자녀 컴포넌트는 글로벌 반응 속성을 설정합니다.navigateTo
최상위 인증 컴포넌트에 의해 감시됩니다.이것에 의해, 인증 체크(로그인 워크플로우)가 트리거 되어, 그 후에 톱 레벨의 컴포넌트가 콜 합니다.$router.push()
이 방법을 사용하면 모든 탐색을 완벽하게 제어할 수 있습니다.
하시면 됩니다.interceptors
어떤 요청이 발생했을 때 자동으로 인증 토큰을 가져옵니다.
axios.interceptors.response.use(function (response) {
return response;
}, function (error) {
const originalRequest = error.config;
if (error.response.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
const rToken = window.localStorage.getItem('rToken');
return axios.post('url/to/get/refresh/token', { rToken })
.then(({data}) => {
window.localStorage.setItem('token', data.token);
window.localStorage.setItem('rToken', data.refreshToken);
axios.defaults.headers.common['Authorization'] = 'Bearer ' + data.token;
originalRequest.headers['Authorization'] = 'Bearer ' + data.token;
return axios(originalRequest);
});
}
return Promise.reject(error);
});
은 '아예'를 사용하기 때문입니다.vuex
, 하다, 하다, 하다 등의 상태를 수 .isLoading
★★★★★★★★★★★★★★★★★」isChecking
당신의 ★★★★★★★★★★★★★★★★★★★★★★★★★★에router.beforeEach
할 수 isLoading
★★★★★★★★★★★★★★★★★」isChecking
현재 체크 상태를 따릅니다.짐을 싣다
route.js에서는 사용자가 토큰을 가지고 있는지 아닌지를 입력하기 전에 체크인합니다.
route.displaces를 설정합니다.
{
path: '/dashboard',
name: dashboard,
meta: {
layout: 'home-layout'
},
components: {
default: Dashboard,
header: UserHeader
},
beforeEnter: ifAuthenticated,
}
route.displaces를 설정합니다.
const ifAuthenticated = (to, from, next) => {
if (localStorage.getItem(token)) {
next();
return;
}
router.push({
name: 'login',
params: {
returnTo: to.path,
query: to.query,
},
});
};
언급URL : https://stackoverflow.com/questions/46262094/checking-auth-token-valid-before-route-enter-in-vue-router
'programing' 카테고리의 다른 글
Vuex 스토어에 여러 상태를 설정할 수 있습니까? (0) | 2022.08.01 |
---|---|
Gson 인스턴스를 모델빈의 정적 필드로 사용해도 될까요(재사용)? (0) | 2022.08.01 |
왜 이 두 번을 빼면 이상한 결과가 나올까요? (0) | 2022.07.29 |
Vue 2.0에서의 CSS 클래스 전환 (0) | 2022.07.29 |
URL 디코딩은 Java에서 어떻게 하나요? (0) | 2022.07.29 |