三木猿 发表于 2022-9-16 14:19

java飞书鉴权(对接前端飞书云文档组件)

本帖最后由 三木猿 于 2022-9-16 14:28 编辑

飞书开放平台目前的全网很难搜到相关的教程,我这边也是慢慢摸索出来的,可能是全网首发了
已同步发布在个人博客:http://www.sanmu.xyz/blog/7
本文基于飞书云文档组件API,地址为https://open.feishu.cn/document/ ... iN3cjN/introduction 我这里主要讲一下后端SDK鉴权流程和对接云文档组件遇到的一些问题 https://open.feishu.cn/document/uYjL24iN/uUDO3YjL1gzN24SN4cjN
1.准备工作 前端想要使用云文档组件必须先在开发者后台开通权限https://s3.bmp.ovh/imgs/2022/09/01/daf08d8fee218331.png
其中前两个是后端获取文件内容需要的权限,如果只用云文档组件不需要获取文件内容则不需要 最后一个是云文档组件必须要开启的,之前因为疏忽没有注意到这个,真实踩过这个坑 ,

原文截图:
https://i.bmp.ovh/imgs/2022/09/01/259d95c61161e713.png
这个权限如果没开启前端使用时会报错: {code:9,msg:"permission Scope Required"}
并且这个报错在文档里是找不到原因的,别问我为啥知道
2.鉴权
window.webComponent.config({
openId,    // 当前登录用户的open id,要确保与生成 signature 使用的 user_access_token 相对应,使用 app_access_token 时此项不填。
signature, // 签名
appId,   // 应用 appId
timestamp, // 时间戳(毫秒)
nonceStr,// 随机字符串
url,       // 参与签名加密计算的url
jsApiList, // 指定要使用的组件,请根据对应组件的开发文档填写。如云文档组件,填写['DocsComponent']
lang,      // 指定组件的国际化语言:en-英文、zh-中文、ja-日文
}).then(res=>{
// 可以在这里进行组件动态渲染
})

以上为前端鉴权代码,可以看到需要后端传的字段为openId,appId,signature,timestamp,nonceStr,url openId:只有用个人账号的形式去鉴权的时候才需要传,我这里是直接以app的身份去进行的鉴权,所以就不需要传。 appId:应用id,他的获取需要在开发者后台-创建企业自建应用,然后点击创建的应用进去在凭证与基础信息就能找到了https://i.bmp.ovh/imgs/2022/09/01/f222ecc5e2157b04.pnghttps://i.bmp.ovh/imgs/2022/09/01/e211c9248b9e59da.png
此时我们获取到了appId和AppSecret,这个最好是保存到后端的配置文件中 appId相当于用户名,所以可以在参数中传递,这个不用太过担心安全问题 timestamp:当前时间戳,取当前时间就行 nonceStr:随机字符串,数字与字母组合,这个使用UUID去掉-就行 url:调用界面的url,参考以下飞书的描述https://i.bmp.ovh/imgs/2022/09/01/46e883fd8331580e.pngsignature:signature放到最后来说,这个是最重要的,篇幅有限,具体步骤请参考飞书: https://open.feishu.cn/document/uYjL24iN/uUDO3YjL1gzN24SN4cjN 其中需要注意的是: access_token是有过期时间的,在未过期时再次获取返回的access_token是不会变的,所以最好是缓存起来,比如放在redis,获取access_token的接口会返回过期时间,就很方便 jsapi_ticket也是有过期时间和使用次数限制的,单次获取的jsapi_ticket只能用一次,也就是每次鉴权都需要使用新的,且过期时间为10分钟 Signature的生成使用sha1代码可以参考:
public static String encode(String str) {
      if (str == null) {
            return null;
      }
      try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.update(str.getBytes());
            byte[] digest = messageDigest.digest();
            StringBuilder sb = new StringBuilder();
            int len = digest.length;
            for (int j = 0; j < len; j++) {
                sb.append(CHARS[(digest >> 4) & 15]);
                sb.append(CHARS & 15]);
            }
            return sb.toString();
      } catch (Exception e) {
            throw new RuntimeException(e);
      }
    }
以上需要注意生成Signature传的timestamp和nonceStr要和返回给前端的一致,前端使用时的url要和生成时的一致 最后将所有参数返回给前端,鉴权就结束了。剩下的就靠前端去弄吧=-=

CreatorHusky 发表于 2022-9-16 18:34

感谢分享
页: [1]
查看完整版本: java飞书鉴权(对接前端飞书云文档组件)