飞书-SSO单点登录

飞书SSO单点登录

飞书 sso 单点登录

可以参考 飞书js-sdk

Documentation - Feishu Open Platform

实现效果

核心代码

js 复制代码
//这里注意容器需要设置固定大小
<el-dialog title='SSO选择登陆' :visible.sync='showDialog' width='800px'>
            <div style='height: 100%'>
                <el-tabs :tab-position='"left"' v-model='currentTab' lazy style='height: 100%;'
                         @tab-click='handleClick'>
                    <el-tab-pane v-if='tabList.length!==0' v-for='item in tabList' :label='item.companyName'
                                 :name='item.appId'>
                        <div style='display: flex;justify-content: center'>
		                        //这里注意容器需要设置大小,不然容易出现多个二维码
		                        //因为有多个容器这里的id需要和item的唯一id相匹配
                            <div :id='`login_container_${item.appId}`' style='width: 300px;height: 300px'></div>
                        </div>
                    </el-tab-pane>
                </el-tabs>
            </div>
        </el-dialog>

注意:

核心代码-封装qrcode方法

js 复制代码
function qrcode(currentTab) {
    //这里是重定向地址需要用户自定义
    const redirect_uri = `XXXXXXXXXXXXXXXXXXX`;
    const redirect_uri_urlEncoded = encodeURIComponent(redirect_uri);
    const goto = `https://passport.feishu.cn/suite/passport/oauth/authorize?client_id=${currentTab}&redirect_uri=${redirect_uri_urlEncoded}&response_type=code&state=STATE`;
    const QRLoginObj = QRLogin({
        id: `login_container_${currentTab}`,
        goto,
        width: '500',
        height: '500',
        style: 'width:300px;height:300px'//可选的,二维码html标签的style属性
    });
    var handleMessage = function(event) {
        console.log(QRLoginObj.matchOrigin(event.origin), QRLoginObj.matchData(event.data), event.data.tmp_code, '飞书返回监听标识');
        // 使用 matchOrigin 和 matchData 方法来判断 message 和来自的页面 url 是否合法
        if (QRLoginObj.matchOrigin(event.origin) && QRLoginObj.matchData(event.data)) {
            var loginTmpCode = event.data.tmp_code;
            console.log('`${goto}&tmp_code=${loginTmpCode}`', loginTmpCode, `${goto}&tmp_code=${loginTmpCode}`);
            // 在授权页面地址上拼接上参数 tmp_code,并跳转
            window.location.href = `${goto}&tmp_code=${loginTmpCode}`;
        }
    };

    if (typeof window.addEventListener != 'undefined') {
        window.addEventListener('message', handleMessage, false);
    } else if (typeof window.attachEvent != 'undefined') {
        window.attachEvent('onmessage', handleMessage);
    }
}

export { qrcode };

在 .vue 中的使用注意点

1.随时更新 currentTab[tab选中的值] 的值

2.首次二维码的更新可能有异步问题,需要借助 nextTick[钩子]

部分核心代码(vue2.0)

js 复制代码
......
this.currentTab = target;
this.$nextTick(() => {
     qrcode(target);
});
......
js 复制代码
handleClick: debounce(function(tab, event) {
    this.currentTab = tab._props.name;
    qrcode(this.currentTab);
}, 1000),
相关推荐
心易行者2 分钟前
Claude Code + Chrome:浏览器层面的AI编程新范式已至
前端·chrome·ai编程
半兽先生4 分钟前
解决使用jsPDF实现表格数据导出pdf功能时中文乱码问题
前端·vue.js·elementui
qq_4061761422 分钟前
吃透JS异步编程:从回调地狱到Promise/Async-Await全解析
服务器·开发语言·前端·javascript·php
幻云201025 分钟前
Python深度学习:筑基与实践
前端·javascript·vue.js·人工智能·python
@大迁世界26 分钟前
停止使用 innerHTML:3 种安全渲染 HTML 的替代方案
开发语言·前端·javascript·安全·html
缘木之鱼27 分钟前
CTFshow __Web应用安全与防护 第二章
前端·安全·渗透·ctf·ctfshow
沛沛老爹28 分钟前
从Web到AI:多模态Agent Skills生态系统实战(Java+Vue构建跨模态智能体)
java·前端·vue.js·人工智能·rag·企业转型
子非鱼92136 分钟前
Vue框架快速上手
前端·javascript·vue.js
winfredzhang36 分钟前
从零构建:基于 Node.js 与 ECharts 的量化交易策略模拟系统
前端·node.js·echarts·股票·策略
Hi_kenyon38 分钟前
JS中的export关键字
开发语言·javascript·vue.js