当前位置: 首页 > backend >正文

【Vue3+TypeScript】H5项目实现企业微信OAuth2.0授权登录完整指南

【Vue3+TypeScript】H5项目实现企业微信OAuth2.0授权登录完整指南

企业微信OAuth2.0授权登录是企业内部应用常见的功能需求,本文将详细介绍如何在Vue3+TypeScript项目中实现企业微信OAuth2.0授权登录功能。

企业微信OAuth2.0授权流程概述

根据企业微信官方文档,OAuth2.0授权登录主要包含以下步骤:

  1. 前端引导用户到企业微信授权页面
  2. 用户同意授权后,企业微信重定向回应用并附带code
  3. 前端将code发送到后端服务器
  4. 后端使用code换取access_token和用户信息
  5. 前端接收登录结果并更新应用状态

核心代码实现

import type { NavigationGuardNext, RouteLocationNormalized, RouteRecordRaw } from "vue-router";
import NProgress from "@/utils/nprogress";
import router from "@/router";
import { usePermissionStore, useUserStore } from "@/store";
import WEWORK_CONFIG from "@/config/weworkConfig";export function setupPermission() {// 白名单路由const whiteList = ["/login"];const authUrl = WEWORK_CONFIG.AUTH_URL;router.beforeEach(async (to, from, next) => {NProgress.start();const access_token = localStorage.getItem("access_token");if (access_token &&access_token !== "undefined" &&access_token !== null &&access_token !== "" &&access_token !== "null") {// 判断是否登录if (to.path === "/login") {// 已登录,访问登录页,跳转到首页next({ path: "/" });} else {const permissionStore = usePermissionStore();// 判断路由是否加载完成if (permissionStore.isRoutesLoaded) {if (to.matched.length === 0) {// 路由未匹配,跳转到404next("/404");} else {// 动态设置页面标题const title = (to.params.title as string) || (to.query.title as string);if (title) {to.meta.title = title;}next();}} else {try {// 加载路由const dynamicRoutes = await permissionStore.generateRoutes();dynamicRoutes.forEach((route: RouteRecordRaw) => router.addRoute(route));next({ ...to, replace: true });console.log("静态路由:", dynamicRoutes);} catch (error) {console.error(error);// 路由加载失败,重置 token 并重定向到登录页await useUserStore().clearUserData();redirectToLogin(to, next);NProgress.done();}}}} else {// 未登录,判断是否在白名单中if (whiteList.includes(to.path)) {next();} else {//不在白名单中,检测用户是否授权(code),若无授权跳转到授权页面,有授权则获取tokenconst urlParams = new URLSearchParams(window.location.search);const code = urlParams.get("code");if (code) {//请求后台接口,使用code换取access_token和用户信息useUserStore().LoginWeiXin({code: code,}).then(() => {next();}).catch((err) => {// 登录失败,清空缓存,重定向至构造网页授权链接console.error(`登录报错:${err}。code:${code}`);useUserStore().clearUserData().then(() => {redirectToLogin(to, next);});});const permissionStore = usePermissionStore();try {// 加载路由const dynamicRoutes = await permissionStore.generateRoutes();dynamicRoutes.forEach((route: RouteRecordRaw) => router.addRoute(route));next();console.log("静态路由:", dynamicRoutes);} catch (error) {console.error(error);// 路由加载失败,重置 token 并重定向到登录页await useUserStore().clearUserData();redirectToLogin(to, next);NProgress.done();}} else {//未授权window.location.href = authUrl;NProgress.done();}}}});// 后置守卫,保证每次路由跳转结束时关闭进度条router.afterEach(() => {NProgress.done();});
}// 重定向到登录页
function redirectToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) {localStorage.clear();const authUrl = WEWORK_CONFIG.AUTH_URL;window.location.href = authUrl;
}

总结

本文详细介绍了在Vue3+TypeScript项目中实现企业微信OAuth2.0授权登录的完整流程,包括:

  1. 企业微信授权流程的理解
  2. 工具类的封装
  3. 状态管理
  4. API接口设计
  5. 登录页面实现
  6. 路由守卫配置
  7. 环境变量和部署注意事项

通过以上实现,你可以为企业内部应用添加安全可靠的企业微信登录功能,提升用户体验和安全性。实际项目中还需根据具体需求进行调整和优化。

希望这篇博客对你有所帮助,欢迎留言交流!

http://www.xdnf.cn/news/20090.html

相关文章:

  • 医疗问诊陪诊小程序:以人性化设计构建健康服务新生态
  • 微信小程序一个页面同时存在input和textarea,bindkeyboardheightchange相互影响
  • 基于STM32单片机的水位浑浊度检测设计
  • Vue CLI 环境变量和文件加载规则.env文件
  • 《Istio故障溯源:从流量劫持异常到服务网格的底层博弈》
  • AI智能优化SEO关键词策略实战
  • 反序列化的学习笔记
  • Docling将pdf转markdown以及与AI生态集成
  • 23种设计模式——原型模式 (Prototype Pattern)详解
  • Java第十四幕集合啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦
  • LabView学习
  • 迁移学习的案例
  • 嵌入式系统学习Day30(udp)
  • AI架构师的新工具箱:DeepSeek、Copilot、AutoML
  • 鸿蒙项目篇-20-创建模拟器
  • 第25节:VR基础与WebXR API入门
  • 命令行中如如何打开目录?vscode中如何打开目录
  • 医疗行业API管理优化:使用QuickAPI提高数据安全与接口性能
  • C++算法专题学习——分治
  • 发现一个Vue开发者的“氮气加速”神器:xiangjsoncraft - 用JSON驱动页面构建
  • AMD KFD驱动技术分析16:SVM Aperture
  • 最新PDF版本!Acrobat Pro DC 2025,解压即用版
  • 力扣:2322. 从树中删除边的最小分数
  • TensorFlow 面试题及详细答案 120道(91-100)-- 实际应用与案例
  • 从零打造商业级LLMOps平台:开源项目LMForge详解,助力多模型AI Agent开发!
  • 【代码随想录day 23】 力扣 93.复原IP地址
  • C++语言程序设计——06 字符串
  • 记录下chatgpt的openai 开发过程
  • Gemini-2.5-Flash-Image-Preview 与 GPT-4o 图像生成能力技术差异解析​
  • U盘文件系统转换指南:方法、原因与注意事项