飞书扫码登录网页

 

二维码 SDK 接入文档

最后更新于 2022-06-14

概述

为了实现在网页内部完成授权登录的流程,避免跳转到飞书登录页,保证流畅的体验,可以接入二维码 SDK 将飞书登录的二维码嵌入到网页中。当用户扫码成功后会返回 tmp_code,即可用来完成后续的授权登录流程。

使用方法

在网页中通过 script 标签引入 SDK:

 
 

<script src="https://sf3-cn.feishucdn.com/obj/feishu-static/lark/passport/qrcode/LarkSSOSDKWebQRCode-1.0.2.js"></script>

引入 SDK 后,通过全局对象 window.QRLogin 创建实例:

 
 

var QRLoginObj = QRLogin({

id:"login_container",

goto: "https://passport.feishu.cn/suite/passport/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code&state=STATE",

width: "500",

height: "500",

style: "width:500px;height:600px"//可选的,二维码html标签的style属性

});

window.QRLogin 入参字段说明:

字段名类型属性描述
idstringrequired二维码展示区域的元素id
gotostringrequired授权页面地址,获取方式
widthstringoptional二维码展示区域的宽(二维码的尺寸固定为250px*250px)
heightstringoptional二维码展示区域的高
stylestringoptional二维码展示区域的样式

window.QRLogin 会返回一个方法 matchOrigin 用来校验域名是否匹配飞书的域名。

通过如下方式监听,当用户扫码成功后,即可获取 tmp_code,然后在授权页面地址(入参中的goto参数)上拼接上参数 tmp_code,并跳转到该地址:

 
 

var handleMessage = function (event) {

var origin = event.origin;

// 使用 matchOrigin 方法来判断 message 来自页面的url是否合法

if( QRLoginObj.matchOrigin(origin) ) {

var loginTmpCode = event.data;

// 在授权页面地址上拼接上参数 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);

}

该链接处理完成后,会重定向到该链接的 redirect_uri 参数所指定的地址,并带上一个授权码(code)。通过授权码可以获取 access_token


https://open.feishu.cn/document/common-capabilities/sso/web-application-sso/qr-sdk-documentation

<script src="https://sf3-cn.feishucdn.com/obj/static/lark/passport/qrcode/LarkSSOSDKWebQRCode-1.0.1.js"></script>
<div id="login_container"></div>
 



mounted() {

            var QRLoginObj = QRLogin({
                id:"login_container",
                goto: "https://passport.feishu.cn/suite/passport/oauth/authorize?client_id=cli_a03f23493d39d00e&redirect_uri=https%3A%2F%2Fwww.baidu.com&response_type=code&state=STATE",
                width: "500",
                height: "500",
            });     
            var handleMessage = function (event) {        
                var origin = event.origin;    
                // 使用 matchOrigin 方法来判断 message 是否来自飞书页面
                if( QRLoginObj.matchOrigin(origin) ) {           
                    var loginTmpCode = event.data; 
                    // 在授权页面地址上拼接上参数 tmp_code,并跳转
                    //window.location.href = `${goto}&tmp_code=${loginTmpCode}`;
                    console.log(loginTmpCode)
                }
            };
            if (typeof window.addEventListener != 'undefined') {   
                window.addEventListener('message', handleMessage, false);} 
            else if (typeof window.attachEvent != 'undefined') { 
                window.attachEvent('onmessage', handleMessage);
            }                
     },

<think>嗯,用户想了解如何在Java应用中实现飞书登录功能,需要示例代和API文档。首先,我得回顾一下飞书的开发流程,之前记得有相关的文档引用。引用[1]提到了飞书的开发文档,里面有对接第三方应用的指南。用户可能需要先创建应用,获取App ID和App Secret,这是常见的第一步。 然后,用户提到登录,这通常涉及OAuth2.0的授权流程。飞书可能使用授权模式,所以需要构造授权URL,让用户后跳转回调地址。接下来,后端需要处理回调,获取授权code,再用code换取access_token。这一步可能需要调用飞书的API,比如像微信那样,引用[4]中的微信接口类似,应该也是类似的步骤。 接下来是代示例部分,用户需要Java的示例。可能需要用到HTTP客户端发送请求,比如使用OkHttp或者Spring的RestTemplate。同时,JSON处理可能会用到Jackson库。然后,代结构大致分为三个步骤:生成登录URL、处理回调、获取用户信息。 还要注意参数替换,比如App ID、App Secret和回调地址需要用户自己填写。另外,飞书的API文档可能会有具体的端点URL,比如授权地址和获取token的地址,需要查阅飞书文档确认是否正确,比如引用[1]中的文档链接。 然后,生成相关问题的时候,要考虑用户可能遇到的后续问题,比如参数配置、错误处理、安全性等,或者与其他平台(如微信、支付宝)的对比,这样能帮助用户更全面地了解。 最后,确保代中的注释和步骤清晰,用户能够按照步骤一步步实现。同时提醒用户参考官方文档,因为接口可能会有变动,保持代的时效性。</think>### Java实现飞书登录功能分步指南 #### 一、准备工作 1. 创建飞书应用:访问[飞书开放平台](https://open.feishu.cn/),创建企业自建应用,获取`app_id`和`app_secret`[^1] 2. 配置权限:在应用后台添加`用户信息`和`手机号`权限 3. 设置重定向URI:在应用配置中添加`redirect_uri`(如:`https://yourdomain.com/auth/callback`) #### 二、核心实现步骤 1. **生成登录二维** ```java // 构造授权URL String authUrl = "https://open.feishu.cn/open-apis/authen/v1/index?" + "app_id=YOUR_APP_ID" + "&redirect_uri=" + URLEncoder.encode("YOUR_REDIRECT_URI", "UTF-8") + "&state=随机防重放参数"; // 将authUrl生成二维(需使用二维生成库) ``` 2. **处理回调请求** ```java // 接收回调参数 String code = request.getParameter("code"); String state = request.getParameter("state"); // 验证state参数有效性 if(!validateState(state)) { throw new AuthException("非法请求"); } ``` 3. **获取访问令牌** ```java // 使用OkHttp发送POST请求 OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, "{\"grant_type\":\"authorization_code\"," + "\"code\":\""+code+"\"}"); Request tokenRequest = new Request.Builder() .url("https://open.feishu.cn/open-apis/authen/v1/access_token") .post(body) .addHeader("Authorization", "Bearer YOUR_APP_ACCESS_TOKEN") .build(); Response response = client.newCall(tokenRequest).execute(); JSONObject tokenData = new JSONObject(response.body().string()); String accessToken = tokenData.getJSONObject("data").getString("access_token"); ``` 4. **获取用户信息** ```java Request userRequest = new Request.Builder() .url("https://open.feishu.cn/open-apis/authen/v1/user_info") .addHeader("Authorization", "Bearer " + accessToken) .build(); Response userResponse = client.newCall(userRequest).execute(); JSONObject userData = new JSONObject(userResponse.body().string()); String userId = userData.getJSONObject("data").getString("user_id"); String mobile = userData.getJSONObject("data").getString("mobile"); ``` #### 三、依赖配置(Maven) ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.3</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency> ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐同保

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值