人生不过短短几十年,莫虚度光阴,到老抱怨年轻的自己 ——行人

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

本文基于飞书云文档组件API,地址为https://open.feishu.cn/document/uYjL24iN/uYDO3YjL2gzN24iN3cjN/introduction 我这里主要讲一下后端SDK鉴权流程和对接云文档组件遇到的一些问题 https://open.feishu.cn/document/uYjL24iN/uUDO3YjL1gzN24SN4cjN

  1. 准备工作 前端想要使用云文档组件必须先在开发者后台开通权限其中前两个是后端获取文件内容需要的权限,如果只用云文档组件不需要获取文件内容则不需要 最后一个是云文档组件必须要开启的,之前因为疏忽没有注意到这个,真实踩过这个坑 ,原文截图:这个权限如果没开启前端使用时会报错: 
    {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,他的获取需要在开发者后台-创建企业自建应用,然后点击创建的应用进去在凭证与基础信息就能找到了此时我们获取到了appId和AppSecret,这个最好是保存到后端的配置文件中 appId相当于用户名,所以可以在参数中传递,这个不用太过担心安全问题 timestamp:当前时间戳,取当前时间就行 nonceStr:随机字符串,数字与字母组合,这个使用UUID去掉-就行 url:调用界面的url,参考以下飞书的描述signature: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[j] >> 4) & 15]);
                sb.append(CHARS[digest[j] & 15]);
            }
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

以上需要注意生成Signature传的timestamp和nonceStr要和返回给前端的一致,前端使用时的url要和生成时的一致 最后将所有参数返回给前端,鉴权就结束了。剩下的就靠前端去弄吧=-=

posted @ 2022-09-21 13:40  夜雨步行人  阅读(457)  评论(0编辑  收藏  举报