飞书H5应用JSSDK鉴权全流程实战uni-app项目配置与避坑指南在移动办公领域企业级应用集成已成为提升工作效率的关键环节。飞书作为领先的协同办公平台其开放能力为开发者提供了丰富的接口支持。本文将聚焦uni-app框架下的飞书H5应用开发从零开始构建完整的JSSDK鉴权流程特别针对实际开发中容易遇到的跨域、签名计算等核心问题进行深度解析。1. 环境准备与基础配置1.1 创建uni-app项目首先确保已安装HBuilderX推荐使用最新稳定版通过可视化界面创建uni-app项目# 通过命令行创建可选 vue create -p dcloudio/uni-preset-vue feishu-h5-demo项目创建完成后需要检查manifest.json文件的基础配置{ h5: { router: { mode: history }, template: public/index.html, devServer: { port: 8080, disableHostCheck: true } } }关键点说明路由模式建议使用history模式避免hash模式可能带来的URL处理问题开发服务器端口建议固定如8080便于后续飞书后台配置禁用host检查可避免本地开发时的访问限制1.2 安装必要依赖飞书JSSDK鉴权需要以下核心依赖npm install js-sha1 larksuiteoapi/js-sdk --save版本兼容性建议js-sha11.0.0及以上larksuiteoapi/js-sdk3.x版本注意避免混用不同版本的SDK可能导致不可预期的签名错误2. 飞书开放平台配置2.1 应用创建与基础设置登录 飞书开放平台进入开发者后台→创建企业自建应用填写应用基本信息后重点配置以下内容配置项说明示例值应用名称用户可见名称员工健康管理系统应用图标建议上传高清LOGO-应用简介简要功能描述员工健康数据采集与分析2.2 安全设置关键配置在安全设置选项卡中必须正确配置以下内容H5可信域名开发环境http://localhost:8080生产环境https://yourdomain.comIP白名单本地开发添加本机公网IP可通过 ipinfo.io 查询服务器部署添加服务器公网IP常见问题若未配置IP白名单调用API时将返回invalid ip错误3. JSSDK鉴权核心流程3.1 获取tenant_access_token在src/utils/auth.js中创建认证模块import { Client } from larksuiteoapi/js-sdk; const client new Client({ appId: your_app_id, appSecret: your_app_secret, domain: https://open.feishu.cn }); export const getTenantToken async () { try { const response await client.auth.tenantAccessToken.create(); return response.tenant_access_token; } catch (error) { console.error(获取tenant_access_token失败:, error); throw error; } };调用示例import { getTenantToken } from /utils/auth; // 在Vue组件中 async function initAuth() { const token await getTenantToken(); localStorage.setItem(feishu_token, token); }3.2 获取jsapi_ticket在获取到tenant_access_token后继续获取jsapi_ticketexport const getJsApiTicket async (tenantToken) { try { const response await client.request({ method: POST, url: /open-apis/jssdk/ticket/get, headers: { Authorization: Bearer ${tenantToken} } }); return response.data.ticket; } catch (error) { console.error(获取jsapi_ticket失败:, error); throw error; } };3.3 签名计算与验证签名计算是鉴权过程中最容易出错的环节以下是完整实现import sha1 from js-sha1; export const generateSignature (ticket, noncestr, timestamp, url) { // 处理URL参数 const cleanUrl url.split(#)[0].replace(/\/$/, ); const verifyStr [ jsapi_ticket${ticket}, noncestr${noncestr}, timestamp${timestamp}, url${cleanUrl} ].join(); return sha1(verifyStr); }; // 生成随机字符串 export const generateNonceStr (length 16) { const chars ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789; let result ; for (let i 0; i length; i) { result chars.charAt(Math.floor(Math.random() * chars.length)); } return result; };4. 前端集成与调试4.1 引入飞书JSSDK在public/index.html中添加SDK引用script srchttps://lf1-cdn-tos.bytegoofy.com/goofy/ee/lark/h5-js-sdk-3.3.0.js/script4.2 初始化配置在Vue组件中实现完整的鉴权流程import { getTenantToken, getJsApiTicket, generateSignature, generateNonceStr } from /utils/auth; export default { methods: { async initFeishuSDK() { try { // 1. 获取tenant_access_token const tenantToken await getTenantToken(); // 2. 获取jsapi_ticket const ticket await getJsApiTicket(tenantToken); // 3. 生成签名参数 const noncestr generateNonceStr(); const timestamp Math.floor(Date.now() / 1000); const url window.location.href; const signature generateSignature(ticket, noncestr, timestamp, url); // 4. 配置JSSDK window.h5sdk.config({ appId: your_app_id, timestamp, nonceStr: noncestr, signature, jsApiList: [ biz.user.getUserInfo, device.health.getStepCount, device.geolocation.get ], onSuccess: () { console.log(JSSDK配置成功); this.$emit(sdk-ready); }, onFail: (err) { console.error(JSSDK配置失败:, err); } }); } catch (error) { console.error(飞书SDK初始化失败:, error); } } }, mounted() { this.initFeishuSDK(); } };4.3 跨域问题解决方案在manifest.json中配置开发服务器代理{ h5: { devServer: { proxy: { /open-apis: { target: https://open.feishu.cn, changeOrigin: true, secure: false } } } } }生产环境需要在Nginx中添加类似配置location /open-apis/ { proxy_pass https://open.feishu.cn/; proxy_set_header Host open.feishu.cn; proxy_set_header X-Real-IP $remote_addr; }5. 常见问题排查指南5.1 签名无效问题排查当遇到invalid signature错误时按以下步骤检查时间戳同步确保服务器时间与飞书服务器时间差在5分钟以内可通过https://open.feishu.cn/open-apis/time接口获取飞书服务器时间URL处理确认URL不包含#及其后内容去除URL末尾的斜杠确保前端传递的URL与后端计算的URL完全一致参数顺序签名参数必须按jsapi_ticket、noncestr、timestamp、url的顺序拼接5.2 其他常见错误代码错误码原因解决方案60011缺少必要参数检查appId、timestamp等必填参数60012签名计算错误按照5.1节检查签名流程60013无效的jsapi_ticket检查ticket是否过期2小时有效期60014无效的URL域名检查飞书后台的可信域名配置5.3 真机调试技巧Android设备使用飞书开发者版应用开启USB调试模式通过chrome://inspect调试H5页面iOS设备使用Safari开发菜单确保设备与开发电脑在同一网络使用飞书测试版应用调试提示在config失败时建议先调用window.h5sdk.error监听全局错误再逐步排查各环节
飞书H5应用JSSDK鉴权保姆级教程:从零到一搞定uni-app项目配置(含跨域、签名、避坑指南)
发布时间:2026/6/6 6:50:04
飞书H5应用JSSDK鉴权全流程实战uni-app项目配置与避坑指南在移动办公领域企业级应用集成已成为提升工作效率的关键环节。飞书作为领先的协同办公平台其开放能力为开发者提供了丰富的接口支持。本文将聚焦uni-app框架下的飞书H5应用开发从零开始构建完整的JSSDK鉴权流程特别针对实际开发中容易遇到的跨域、签名计算等核心问题进行深度解析。1. 环境准备与基础配置1.1 创建uni-app项目首先确保已安装HBuilderX推荐使用最新稳定版通过可视化界面创建uni-app项目# 通过命令行创建可选 vue create -p dcloudio/uni-preset-vue feishu-h5-demo项目创建完成后需要检查manifest.json文件的基础配置{ h5: { router: { mode: history }, template: public/index.html, devServer: { port: 8080, disableHostCheck: true } } }关键点说明路由模式建议使用history模式避免hash模式可能带来的URL处理问题开发服务器端口建议固定如8080便于后续飞书后台配置禁用host检查可避免本地开发时的访问限制1.2 安装必要依赖飞书JSSDK鉴权需要以下核心依赖npm install js-sha1 larksuiteoapi/js-sdk --save版本兼容性建议js-sha11.0.0及以上larksuiteoapi/js-sdk3.x版本注意避免混用不同版本的SDK可能导致不可预期的签名错误2. 飞书开放平台配置2.1 应用创建与基础设置登录 飞书开放平台进入开发者后台→创建企业自建应用填写应用基本信息后重点配置以下内容配置项说明示例值应用名称用户可见名称员工健康管理系统应用图标建议上传高清LOGO-应用简介简要功能描述员工健康数据采集与分析2.2 安全设置关键配置在安全设置选项卡中必须正确配置以下内容H5可信域名开发环境http://localhost:8080生产环境https://yourdomain.comIP白名单本地开发添加本机公网IP可通过 ipinfo.io 查询服务器部署添加服务器公网IP常见问题若未配置IP白名单调用API时将返回invalid ip错误3. JSSDK鉴权核心流程3.1 获取tenant_access_token在src/utils/auth.js中创建认证模块import { Client } from larksuiteoapi/js-sdk; const client new Client({ appId: your_app_id, appSecret: your_app_secret, domain: https://open.feishu.cn }); export const getTenantToken async () { try { const response await client.auth.tenantAccessToken.create(); return response.tenant_access_token; } catch (error) { console.error(获取tenant_access_token失败:, error); throw error; } };调用示例import { getTenantToken } from /utils/auth; // 在Vue组件中 async function initAuth() { const token await getTenantToken(); localStorage.setItem(feishu_token, token); }3.2 获取jsapi_ticket在获取到tenant_access_token后继续获取jsapi_ticketexport const getJsApiTicket async (tenantToken) { try { const response await client.request({ method: POST, url: /open-apis/jssdk/ticket/get, headers: { Authorization: Bearer ${tenantToken} } }); return response.data.ticket; } catch (error) { console.error(获取jsapi_ticket失败:, error); throw error; } };3.3 签名计算与验证签名计算是鉴权过程中最容易出错的环节以下是完整实现import sha1 from js-sha1; export const generateSignature (ticket, noncestr, timestamp, url) { // 处理URL参数 const cleanUrl url.split(#)[0].replace(/\/$/, ); const verifyStr [ jsapi_ticket${ticket}, noncestr${noncestr}, timestamp${timestamp}, url${cleanUrl} ].join(); return sha1(verifyStr); }; // 生成随机字符串 export const generateNonceStr (length 16) { const chars ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz0123456789; let result ; for (let i 0; i length; i) { result chars.charAt(Math.floor(Math.random() * chars.length)); } return result; };4. 前端集成与调试4.1 引入飞书JSSDK在public/index.html中添加SDK引用script srchttps://lf1-cdn-tos.bytegoofy.com/goofy/ee/lark/h5-js-sdk-3.3.0.js/script4.2 初始化配置在Vue组件中实现完整的鉴权流程import { getTenantToken, getJsApiTicket, generateSignature, generateNonceStr } from /utils/auth; export default { methods: { async initFeishuSDK() { try { // 1. 获取tenant_access_token const tenantToken await getTenantToken(); // 2. 获取jsapi_ticket const ticket await getJsApiTicket(tenantToken); // 3. 生成签名参数 const noncestr generateNonceStr(); const timestamp Math.floor(Date.now() / 1000); const url window.location.href; const signature generateSignature(ticket, noncestr, timestamp, url); // 4. 配置JSSDK window.h5sdk.config({ appId: your_app_id, timestamp, nonceStr: noncestr, signature, jsApiList: [ biz.user.getUserInfo, device.health.getStepCount, device.geolocation.get ], onSuccess: () { console.log(JSSDK配置成功); this.$emit(sdk-ready); }, onFail: (err) { console.error(JSSDK配置失败:, err); } }); } catch (error) { console.error(飞书SDK初始化失败:, error); } } }, mounted() { this.initFeishuSDK(); } };4.3 跨域问题解决方案在manifest.json中配置开发服务器代理{ h5: { devServer: { proxy: { /open-apis: { target: https://open.feishu.cn, changeOrigin: true, secure: false } } } } }生产环境需要在Nginx中添加类似配置location /open-apis/ { proxy_pass https://open.feishu.cn/; proxy_set_header Host open.feishu.cn; proxy_set_header X-Real-IP $remote_addr; }5. 常见问题排查指南5.1 签名无效问题排查当遇到invalid signature错误时按以下步骤检查时间戳同步确保服务器时间与飞书服务器时间差在5分钟以内可通过https://open.feishu.cn/open-apis/time接口获取飞书服务器时间URL处理确认URL不包含#及其后内容去除URL末尾的斜杠确保前端传递的URL与后端计算的URL完全一致参数顺序签名参数必须按jsapi_ticket、noncestr、timestamp、url的顺序拼接5.2 其他常见错误代码错误码原因解决方案60011缺少必要参数检查appId、timestamp等必填参数60012签名计算错误按照5.1节检查签名流程60013无效的jsapi_ticket检查ticket是否过期2小时有效期60014无效的URL域名检查飞书后台的可信域名配置5.3 真机调试技巧Android设备使用飞书开发者版应用开启USB调试模式通过chrome://inspect调试H5页面iOS设备使用Safari开发菜单确保设备与开发电脑在同一网络使用飞书测试版应用调试提示在config失败时建议先调用window.h5sdk.error监听全局错误再逐步排查各环节