Acme

Feishu QRCode Login

飞书二维码登录组件是一个框架无关的 React 组件,用于实现飞书 OAuth 登录功能。组件会自动加载飞书 SDK,生成二维码,并处理扫码登录流程。

<FeishuQrcodeLogin
  clientId="your_client_id"
  redirectUri="https://your-domain.com/auth/callback"
  onLoginSuccess={(tmpCode, gotoUrl) => {
    window.location.href = gotoUrl
  }}
/>
二维码加载中...

二维码如不显示,请刷新网页

加载代码中...

简介

飞书二维码登录组件是一个框架无关的 React 组件,用于实现飞书 OAuth 登录功能。组件会自动加载飞书 SDK,生成二维码,并处理扫码登录流程。

安装

npx shadcn@latest add feishu-qrcode-login

使用

import { FeishuQrcodeLogin } from "@/components/ui/feishu-qrcode-login"
<FeishuQrcodeLogin
  clientId="cli_xxxxx"
  redirectUri="https://your-domain.com/auth/callback"
  onLoginSuccess={(tmpCode, gotoUrl) => {
    // 处理登录成功
    console.log("临时授权码:", tmpCode)
    window.location.href = gotoUrl
  }}
  onError={(error) => {
    // 处理错误
    console.error("登录失败:", error)
  }}
/>

功能特性

  • ✅ 自动加载飞书 QRCode SDK
  • ✅ 防止重复初始化(React 严格模式兼容)
  • ✅ 完整的错误处理和加载状态
  • ✅ 框架无关,支持任何 React 项目
  • ✅ TypeScript 类型支持
  • ✅ 支持自定义样式

示例

基本用法

<FeishuQrcodeLogin
  clientId="cli_xxxxx"
  redirectUri="https://example.com/auth/callback"
  onLoginSuccess={(tmpCode, gotoUrl) => {
    window.location.href = gotoUrl
  }}
/>

自定义样式

<FeishuQrcodeLogin
  clientId="cli_xxxxx"
  redirectUri="https://example.com/auth/callback"
  onLoginSuccess={(tmpCode, gotoUrl) => {
    window.location.href = gotoUrl
  }}
  className="shadow-xl border-2 border-primary/20"
/>

在 Card 中使用

<Card className="w-full max-w-md mx-auto">
  <CardHeader className="text-center">
    <CardTitle>欢迎登录</CardTitle>
    <CardDescription>请使用飞书移动端扫码登录</CardDescription>
  </CardHeader>
  <CardContent>
    <FeishuQrcodeLogin
      clientId="cli_xxxxx"
      redirectUri="https://example.com/auth/callback"
      onLoginSuccess={(tmpCode, gotoUrl) => {
        window.location.href = gotoUrl
      }}
    />
  </CardContent>
</Card>

API Reference

FeishuQrcodeLogin

属性类型默认值描述
clientIdstring-飞书应用的 Client ID(必需)
redirectUristring-授权回调地址(必需)
authorizeUrlstring"https://passport.feishu.cn/suite/passport/oauth/authorize"飞书授权地址
widthnumber | string300二维码宽度
heightnumber | string300二维码高度
statestringwindow.location.origin自定义状态参数,用于防止 CSRF 攻击
onLoginSuccess(tmpCode: string, gotoUrl: string) => void | Promise<void>-登录成功回调函数(必需)
onError(error: Error) => void-错误处理回调函数
classNamestring-自定义 CSS 类名

回调参数说明

onLoginSuccess

  • tmpCode: 飞书返回的临时授权码
  • gotoUrl: 完整的授权 URL(包含 tmp_code)

通常的做法是直接跳转到 gotoUrl,或者使用 tmpCode 调用后端 API 完成登录。

onError

  • error: 错误对象,包含错误信息

获取飞书应用凭证

  1. 访问 飞书开放平台
  2. 创建企业自建应用或第三方应用
  3. 在应用详情页获取 App ID(即 clientId
  4. 配置重定向 URL(即 redirectUri
  5. 开启「网页」应用能力

完整的登录流程

  1. 用户扫描二维码
  2. 组件获取 tmpCode 并调用 onLoginSuccess
  3. 跳转到飞书授权页面或调用后端 API
  4. 后端使用 tmpCode 换取 access_token
  5. 完成用户登录

注意事项

  • 确保 redirectUri 已在飞书应用后台配置
  • 在生产环境使用 HTTPS
  • 建议设置自定义 state 参数增强安全性
  • 二维码有效期为 5 分钟,过期需要刷新页面

常见问题

二维码不显示?

  1. 检查网络连接,确保能访问飞书 CDN
  2. 查看浏览器控制台是否有错误信息
  3. 尝试刷新页面

扫码后报错?

  1. 检查 clientId 是否正确
  2. 确认 redirectUri 是否已在飞书后台配置
  3. 检查 onLoginSuccess 回调函数是否有异常

相关链接