如何在 vue 中存储、管理 REST API JWT 身份验证令牌?

Posted

技术标签:

【中文标题】如何在 vue 中存储、管理 REST API JWT 身份验证令牌?【英文标题】:How to store, manage REST API JWT authentication token in vue? 【发布时间】:2019-11-29 05:40:44 【问题描述】:

我是一个菜鸟,使用 vue.js 和节点身份验证 api,该 api 工作正常并在响应中提供 jwt 令牌,我的问题是如何在随后的所有请求中使用令牌(使用 axios) ,以及任何在前端处理令牌的最佳实践。

谢谢

【问题讨论】:

您应该将令牌保存在本地存储中并随每个请求一起发送 展示你的作品? methods: login(e) e.preventDefault() let currentObj = this this.axios.post('http://localhost:3600/auth', email: this.email, password: this.password ) .then(function (response) // how to store the token after this??? currentObj.output = response.data console.log(currentObj.output) ) .catch(function (error) currentObj.output = error console.log(currentObj.output) ) 【参考方案1】:

您可以在您的 vuejs 应用程序中为您的场景使用类似的东西。

import axios from 'axios'

const API_URL = 'http://localhost:3000'

const securedAxiosInstance = axios.create(
  baseURL: API_URL,
  withCredentials: true,
  headers: 
    'Content-Type': 'application/json'
  
)

const plainAxiosInstance = axios.create(
  baseURL: API_URL,
  withCredentials: true,
  headers: 
    'Content-Type': 'application/json'
  
)

securedAxiosInstance.interceptors.request.use(config => 
  const method = config.method.toUpperCase()
  if (method !== 'OPTIONS' && method !== 'GET') 
    config.headers = 
      ...config.headers,
      'X-CSRF-TOKEN': localStorage.csrf
    
  
  return config
)

securedAxiosInstance.interceptors.response.use(null, error => 
  if (
    error.response &&
    error.response.config &&
    error.response.status === 401
  ) 
    return plainAxiosInstance
      .post('/refresh', ,  headers:  'X-CSRF-TOKEN': localStorage.csrf  )
      .then(response => 
        localStorage.csrf = response.data.csrf
        localStorage.signedIn = true

        let retryConfig = error.response.config
        retryConfig.headers['X-CSRF-TOKEN'] = localStorage.csrf
        return plainAxiosInstance.request(retryConfig)
      )
      .catch(error => 
        delete localStorage.csrf
        delete localStorage.signedIn

        location.replace('/')
        return Promise.reject(error)
      )
   else 
    return Promise.reject(error)
  
)

export  securedAxiosInstance, plainAxiosInstance 

在您的组件中,您可以使用它来处理您的 api 请求

Products.vue

export default 
  name: 'products',
  data () 
    return 
      products: [],
      newProduct: [],
      error: '',
      editedProduct: ''
    
  ,
  created () 
    if (!localStorage.signedIn) 
      this.$router.replace('/')
     else 
      this.$http.secured.get('/api/v1/products')
        .then(response =>  this.products = response.data )
        .catch(error => this.setError(error, 'Something went wrong'))
    
  ,
  methods: 
    setError (error, text) 
      this.error = (error.response && error.response.data && error.response.data.error) || text
    ,
    addProduct () 
      const value = this.newProduct
      if (!value) 
        return
      
      this.$http.secured.post('/api/v1/products/',  product:  name: this.newProduct.name  )
        .then(response => 
          this.products.push(response.data)
          this.newProduct = ''
        )
        .catch(error => this.setError(error, 'Cannot create product'))
    ,
    removeProduct (product) 
      this.$http.secured.delete(`/api/v1/products/$product.id`)
        .then(response => 
          this.products.splice(this.products.indexOf(product), 1)
        )
        .catch(error => this.setError(error, 'Cannot delete product'))
    ,
    editProduct (product) 
      this.editedproduct = product
    ,
    updateProduct (product) 
      this.editedProduct = ''
      this.$http.secured.patch(`/api/v1/products/$product.id`,  product:  title: product.name  )
        .catch(error => this.setError(error, 'Cannot update product'))
    
  

【讨论】:

【参考方案2】:

您可以找到here 很多我个人在项目中使用的好模式以及 JWT 令牌处理方式。

要在浏览器中保存令牌,您可以使用 cookie、sessionStorage 或 localStorate,最后一个是现在最流行的(简短说明here)。

简而言之,您可以创建一个 axion 实例并在发送请求之前添加一个令牌。

const http = axios.create(
  baseURL: process.env.VUE_APP_SERVER_API,
  // here you can specify other params 
)

http.interceptors.request.use(request => 
  // Do something before request is sent
  request.headers['Authorization'] = `JWT $TOKEN_HERE`
  // some logic what to do if toke invalid, etc ...
  return request
, function (error) 
  // Do something with request error
  return Promise.reject(error)
)

【讨论】:

那么 localStorage 可以使用吗?,我发现一些帖子说 otherwsie 是的,这很正常。有时使用 sessionStorage 会更好,这取决于您的情况。 $TOKEN_HERE 来自哪里?

以上是关于如何在 vue 中存储、管理 REST API JWT 身份验证令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel rest api 在 vue-tables-2 上添加分页?

处理django rest framework + vue SPA auth

如何在 Android 中使用 REST API 将图像上传到 S3 存储桶,出现禁止错误:403

如何使用 REST API 或 ARM 模板通过私有 GitHub 存储库在应用服务中部署应用?

React Native - 如何使用 JWT 令牌从 WordPress REST API 获取私人帖子

如何使 Vue.js 将散列密码发布到 Django REST API AbstractBaseUser 自定义模型?