搜尋

首頁  >  問答  >  主體

javascript - 登入攔截邏輯問題?

現在我輸入帳號密碼,瀏覽器發送請求,成功回傳了token;

#想問的是:這個token我放在cookie裡好還是localStorage好呢?

還有就是其他頁面的登入攔截怎麼處理?

是判斷cookie或localStorage裡有token就放行嗎?
(如果是,別人隨便造一個token也可以放行了啊)

還有成功的回傳的超時時間是怎麼用,是放在cookie裡面嗎?

還是我的思路是錯的?

PHP中文网PHP中文网2796 天前633

全部回覆(2)我來回復

  • 某草草

    某草草2017-05-16 13:33:56

    用戶認證成功後,服務端回傳的 token 值,前端一般存在 localStorage 里。
    每次发出请求的时候,把该 token 放在请求头即可。
    下面以 axios為例:

    
    // http request 拦截器
    api.interceptors.request.use(config => {
      if (window.localStorage.ACCESS_TOKEN) {
        config.headers.Authorization = 'Bearer ' + window.localStorage.ACCESS_TOKEN
      }
      return config
    }, error => {
      return Promise.reject(error)
    })
    
    // http response 拦截器
    api.interceptors.response.use(response => {
      if (response.status === 401) { // token过期
        window.localStorage.removeItem('ACCESS_TOKEN')
        router.replace({
          path: '/user/login',
          query: {
            redirect: router.currentRoute.fullPath
          }
        })
      }
      return response
    }, error => {
      return Promise.reject(error)
    })
    

    頁面的登入攔截以 vue.jsvue-router 為例:

    // 导航钩子
    router.beforeEach((to, from, next) => {
      // 检查登录状态
      store.commit(types.CHECKOUT_LOGIN_STATUS)
      if (to.matched.some(record => record.meta.requiresAuth)) { // 判断该路由是否需要登录权限
        if (window.localStorage.ACCESS_TOKEN) { // 如果本地存在 access_token,则继续导航
          next()
        } else {
          if (name === 'userLogin') {
            next()
          } else {
            next({ // 登录成功后,自动跳转到之前的页面
              path: '/user/login',
              query: {
                redirect: to.fullPath
              }
            })
          }
        }
      } else {
        next()
      }
    })
    

    另外 token 值一般是很难伪造的,因为每次请求都会向后端去验证该 token 值的有效性。

    回覆
    0
  • PHPz

    PHPz2017-05-16 13:33:56

    建議 透過 服務端傳回的 request 中 使用 setCookie 的方式進行 token設置,並且設定為 httpOnly,後面的請求中帶上cookie,然後根據 server 的回調判斷狀態。

    回覆
    0
  • 取消回覆