如何在 Flask 后端与 Vue 前端之间安全传递 Access Token

秋磊酱_6293

秋磊酱_6293

2026-05-17

1153人浏览

原创

如何在 Flask 后端与 Vue 前端之间安全传递 Access Token

本文详解如何在 flask(后端)与 vue.js(前端)构成的认证系统中,安全、规范地将 auth0 签发的 jwt access token 从后端传递至前端,并在后续 api 请求中正确携带。涵盖登录流程设计、token 存储策略及请求拦截实践。

本文详解如何在 flask(后端)与 vue.js(前端)构成的认证系统中,安全、规范地将 auth0 签发的 jwt access token 从后端传递至前端,并在后续 api 请求中正确携带。涵盖登录流程设计、token 存储策略及请求拦截实践。

在典型的前后端分离架构中,access token 并非由后端“主动推送”给前端,而是由前端在完成身份认证(如重定向到 Auth0 登录页)后,通过授权码(Authorization Code)交换流程,从认证服务器(如 Auth0)直接获取。Flask 后端在此过程中主要承担两个关键角色:一是作为 OAuth2 的后端服务(Resource Server),验证并解析前端传来的 token;二是可选地作为代理或登录回调处理端(Authentication Server),协助完成 token 交换(尤其在使用 PKCE 或服务端渲染场景下)。但根据你提供的代码,当前 Flask 仅作为 Resource Server —— 它不生成 token,也不负责发放 token 给前端。

因此,正确的 Token 流程应为:

  1. 前端发起登录:Vue 应用跳转至 Auth0 授权端点(https://{DOMAIN}/authorize?...),携带 response_type=code、client_id、redirect_uri 等参数;
  2. 用户认证后重定向回前端:Auth0 将授权码(code)附加在 redirect_uri 查询参数中返回给 Vue;
  3. 前端将 code 发送给 Flask 后端(可选但推荐):为避免暴露 client_secret,最佳实践是由前端将 code 发送至 Flask 的 /callback 接口,由后端调用 Auth0 /oauth/token 端点换取 access_token(及 id_token);
  4. Flask 后端返回 token 给前端:后端成功换取 token 后,通过 JSON 响应将 access_token(及过期时间 expires_in)返回给前端;
  5. 前端安全存储并使用 token:将 token 存入内存(短期)、localStorage(便捷但需防 XSS)或更安全的 httpOnly: false + Secure + SameSite=Lax Cookie(需配合 Axios withCredentials: true);
  6. 后续请求自动携带 token:所有受保护 API 请求(如 /actor-list)均在 Authorization: Bearer 头中携带。

✅ 示例:Flask 新增 /api/login/callback 接口(需安装 requests)

import requests
from flask import request, jsonify

@app.route('/api/login/callback', methods=['POST'])
def exchange_code_for_token():
    data = request.get_json()
    auth_code = data.get('code')
    redirect_uri = data.get('redirect_uri', 'http://localhost:8080/callback')

    # 向 Auth0 交换 token
    token_url = f'https://{AUTH0_DOMAIN}/oauth/token'
    payload = {
        'grant_type': 'authorization_code',
        'client_id': 'YOUR_VUE_APP_CLIENT_ID',
        'client_secret': 'YOUR_FLASK_BACKEND_CLIENT_SECRET',  # ⚠️ 仅后端持有!
        'code': auth_code,
        'redirect_uri': redirect_uri
    }

    response = requests.post(token_url, json=payload)
    if response.status_code != 200:
        return jsonify({'error': 'Token exchange failed'}), 401

    token_data = response.json()
    return jsonify({
        'access_token': token_data['access_token'],
        'expires_in': token_data['expires_in'],
        'token_type': token_data['token_type']
    })

✅ Vue 前端调用示例(在回调页面中):

精英前端设计-专业版
精英前端设计-专业版

企业级前端设计系统,支持多页面应用、React/Vue组件、品牌一致性与高级动效编排。

下载
// callback.vue 或 login handler 中
async mounted() {
  const urlParams = new URLSearchParams(window.location.search);
  const code = urlParams.get('code');
  if (code) {
    try {
      const res = await axios.post('http://127.0.0.1:5000/api/login/callback', {
        code,
        redirect_uri: 'http://localhost:8080/callback'
      });
      // ✅ 安全存储(生产环境建议配合 short-lived 内存缓存 + refresh 机制)
      localStorage.setItem('accessToken', res.data.access_token);
      localStorage.setItem('tokenExpiry', Date.now() + res.data.expires_in * 1000);

      // 跳转至受保护页面
      this.$router.push('/actor-list');
    } catch (err) {
      console.error('Login failed:', err);
    }
  }
}

✅ 在 ActorList.vue 中动态使用 token:

mounted() {
  const accessToken = localStorage.getItem('accessToken');
  if (!accessToken) {
    this.$router.push('/login');
    return;
  }

  axios.get('http://127.0.0.1:5000/actor-list', {
    headers: {
      'Authorization': `Bearer ${accessToken}`
    }
  })
  .then(response => {
    this.actorList = response.data.actor;
  })
  .catch(error => {
    if (error.response?.status === 401) {
      // Token 过期或无效,清理并跳转登录
      localStorage.removeItem('accessToken');
      this.$router.push('/login');
    }
    console.error("API request failed:", error);
  });
}

⚠️ 重要注意事项:

  • 绝不硬编码 token:你当前 const accessToken = '***' 的方式仅适用于测试,生产环境必须动态获取;
  • 避免 localStorage 存储敏感 token(若存在 XSS 风险):高安全要求应用应采用 httpOnly: false Cookie + withCredentials: true,或结合内存存储 + 定时刷新;
  • Flask 不应直接返回原始 token 给前端(除非必要):你的 auth.py 当前未提供任何登录/交换接口,需补充完整 OAuth2 流程;
  • 始终校验 token 签名与声明:你已实现 verify_decode_jwt,这是正确做法,确保后端只信任 Auth0 签发的有效 token;
  • 前端需处理 token 过期逻辑:检查 exp 声明或本地缓存的过期时间,避免静默失败。

总结:Access token 的传递本质是 前端主导的 OAuth2 流程协作结果,Flask 的职责是安全验证(而非分发)和可选的 token 交换代理。通过补全 /callback 接口、规范前端存储与请求拦截,即可实现健壮、可维护的认证集成。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

vue 前端 access

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2823

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7090

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6606

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2823

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6143

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7090

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6898

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

983

5

C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3649

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.4万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 2.6万人学习