programing

Vue 라우터에서 경로 입력 전에 인증 토큰이 유효한지 확인하는 중

javaba 2022. 7. 30. 00:00
반응형

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.hrefrouter.pushcsrf 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

반응형