PublicAPI鉴权示例|飞书低代码平台

PublicAPI鉴权示例|飞书低代码平台

飞书低代码平台手册精选NaN-NaN-NaN
产品功能
函数发布为 Public API 后若需要设置鉴权,可采用以下「数字签名鉴权」的方式。
鉴权逻辑
  • 用户在客户端对其 API 请求进行签名(通过「约定的密钥」和一定的「规则」生成数字签名),并通过请求 Header 的 Authorization 传输该签名。
  • 服务端通过「约定的密钥」及相同的「规则」计算数字签名,并同请求 Header Authorization 中获取的数字签名进行比对,判断是否鉴权通过。
250px|700px|reset
image.png
签名字符串生成规则
将 JSON 类型的请求参数(key-value 类型的需转换为 JSON 类型)直接转换为 JSON 字符串。
数字签名生成规则
将「签名字符串」与约定的「密钥字符串」按签名字符串在左、密钥字符串在右的顺序拼接,然后再将拼接好的字符串通过 MD5 算法加密,即得到「数字签名」。
公式表示为: Signature = MD5(SignString + Secret)
  • SignString :通过请求参数生成的「签名字符串」。
  • Secret:约定的密钥字符串。
  • MD5():MD5 哈希加密算法。
示例代码
需手动安装并引入 NPM 依赖(为完成加密,示例中使用的是 md5@2.3.0 包)。
// 通过 NPM dependencies 成功安装 NPM 包后此处可引入使用
// 如安装 linq 包后就可以引入并使用这个包
// const linq = require('linq');
const md5 = require('md5');
/**
* @param params 自定义参数
* @param {Context} context 上下文参数,可通过此参数下钻获取上下文变量信息
* @param {Logger} logger 日志记录器
*
* @return 函数的返回数据
*
*/
module.exports = async function (params, context, logger) {
// 日志功能
logger.info(`${new Date()} 函数开始执行`);
// 利用约定的密钥生成的数字签名鉴权
const accessSecret = kunlun.getVar('accessSecret'); // 约定的密钥,推荐存储在全局变量中,如示例中存储在了某 key 为 accessSecret 的全局变量中
// 对 key 进行排序,避免 parmas 内部键值对顺序不一致带来的鉴权失败问题
let obj = {};
Object.keys(params).sort().forEach(k => {
obj[k] = params[k]
});
const signature = md5(JSON.stringify(obj) + accessSecret); // 计算数字签名
if (signature !== context.headers['authorization']) { // 当请求中传输的数字签名不合规时鉴权失败
return {
"code": "-1", // 返回业务错误码
"msg": "Authentication failed." // 返回业务错误信息
}
}
// 在这里补充业务代码
// 典型场景示例代码可参考 https://bytedance.feishu.cn/docs/doccnI20Snt1zFr77jemjmHHFDc
}
先进生产力和业务协同平台
联系我们立即试用

先进团队,先用飞书

欢迎联系我们,飞书效能顾问将为您提供全力支持
分享先进工作方式
输送行业最佳实践
全面协助组织提效
PublicAPI鉴权示例|飞书低代码平台
先进生产力和业务协同平台
联系我们立即试用
联系我们立即试用