Better Auth Discord认证:社区平台身份验证

Better Auth Discord认证:社区平台身份验证

【免费下载链接】better-auth The most comprehensive authentication framework for TypeScript 【免费下载链接】better-auth 项目地址: https://gitcode.com/GitHub_Trending/be/better-auth

概述

Discord作为全球最大的游戏社区和开发者平台,拥有超过3亿注册用户。对于需要构建社区驱动的应用程序来说,集成Discord身份验证(Discord OAuth)已成为必不可少的功能。Better Auth提供了开箱即用的Discord认证支持,让开发者能够快速、安全地实现Discord登录功能。

Discord OAuth 2.0 认证流程

Better Auth的Discord认证基于OAuth 2.0协议,整个认证流程如下:

mermaid

快速开始

1. 获取Discord开发者凭证

首先需要在Discord开发者门户创建应用并获取凭证:

  1. 访问 Discord开发者门户
  2. 创建新应用或选择现有应用
  3. 在OAuth2标签页获取Client ID和Client Secret
  4. 设置重定向URL:http://localhost:3000/api/auth/callback/discord

2. 配置Better Auth

// auth.ts - 服务器端配置
import { betterAuth } from "better-auth"

export const auth = betterAuth({
  socialProviders: {
    discord: {
      clientId: process.env.DISCORD_CLIENT_ID as string,
      clientSecret: process.env.DISCORD_CLIENT_SECRET as string,
      // 可选:自定义作用域
      scope: ["guilds", "guilds.join"],
      // 可选:自定义用户信息映射
      mapProfileToUser: async (profile) => {
        return {
          customField: profile.username + "#" + profile.discriminator
        }
      }
    }
  }
})

3. 客户端登录实现

// auth-client.ts - 客户端实现
import { createAuthClient } from "better-auth/client"

const authClient = createAuthClient()

// Discord登录函数
const signInWithDiscord = async () => {
  try {
    const { data, error } = await authClient.signIn.social({
      provider: "discord"
    })
    
    if (error) {
      console.error("Discord登录失败:", error.message)
      return
    }
    
    console.log("登录成功:", data.user)
  } catch (err) {
    console.error("认证过程出错:", err)
  }
}

// React组件示例
function DiscordLoginButton() {
  return (
    <button onClick={signInWithDiscord} className="discord-login-btn">
      <img src="/discord-logo.svg" alt="Discord" />
      使用Discord登录
    </button>
  )
}

Discord用户信息结构

Better Auth自动处理Discord API返回的用户信息,提供完整的类型定义:

字段类型描述
idstring用户唯一标识符(数字雪花ID)
usernamestring用户名(不唯一)
discriminatorstringDiscord标签(4位数字)
global_namestring全局显示名称
avatarstring头像哈希值
emailstring邮箱地址
verifiedboolean邮箱是否验证
localestring用户语言设置
mfa_enabledboolean是否启用双因素认证
premium_typenumberNitro订阅类型

高级配置选项

自定义作用域配置

discord: {
  clientId: process.env.DISCORD_CLIENT_ID,
  clientSecret: process.env.DISCORD_CLIENT_SECRET,
  // 禁用默认作用域
  disableDefaultScope: false,
  // 添加自定义作用域
  scope: ["guilds", "guilds.members.read", "connections"],
  // 或使用scopes数组
  scopes: ["identify", "email", "guilds"]
}

用户信息自定义映射

discord: {
  clientId: process.env.DISCORD_CLIENT_ID,
  clientSecret: process.env.DISCORD_CLIENT_SECRET,
  async mapProfileToUser(profile) {
    return {
      // 自定义用户字段
      discordTag: `${profile.username}#${profile.discriminator}`,
      premiumUser: profile.premium_type > 0,
      locale: profile.locale,
      // 计算头像URL
      avatarUrl: profile.avatar 
        ? `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}.png`
        : null
    }
  }
}

错误处理与重试机制

const signInWithDiscord = async (maxRetries = 3) => {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const result = await authClient.signIn.social({
        provider: "discord",
        // 可选:自定义重定向URL
        redirectTo: "/dashboard"
      })
      
      if (result.error) {
        if (result.error.code === "rate_limited") {
          // 处理速率限制
          await new Promise(resolve => setTimeout(resolve, 1000 * attempt))
          continue
        }
        throw new Error(result.error.message)
      }
      
      return result.data
    } catch (error) {
      if (attempt === maxRetries) {
        throw error
      }
    }
  }
}

安全最佳实践

1. 环境变量管理

# .env.local
DISCORD_CLIENT_ID=your_client_id_here
DISCORD_CLIENT_SECRET=your_client_secret_here
DISCORD_REDIRECT_URI=http://localhost:3000/api/auth/callback/discord

2. CSRF保护

Better Auth自动处理state参数来防止CSRF攻击:

// 自动生成的state参数示例
const authorizationURL = await authClient.signIn.social({
  provider: "discord",
  // state参数自动生成和验证
})

3. 令牌刷新机制

discord: {
  clientId: process.env.DISCORD_CLIENT_ID,
  clientSecret: process.env.DISCORD_CLIENT_SECRET,
  // 自定义令牌刷新逻辑
  async refreshAccessToken(refreshToken) {
    // 自定义刷新逻辑
    const newTokens = await refreshDiscordToken(refreshToken)
    return newTokens
  }
}

实际应用场景

游戏社区集成

// 游戏社区特定的用户处理
discord: {
  clientId: process.env.DISCORD_CLIENT_ID,
  clientSecret: process.env.DISCORD_CLIENT_SECRET,
  scope: ["guilds", "guilds.members.read"],
  async getUserInfo(token) {
    const profile = await fetchDiscordProfile(token.accessToken)
    const guilds = await fetchUserGuilds(token.accessToken)
    
    return {
      user: {
        id: profile.id,
        name: profile.username,
        email: profile.email,
        image: profile.avatar_url,
        // 游戏特定字段
        gameProfile: {
          discordGuilds: guilds,
          nitroStatus: profile.premium_type
        }
      },
      data: profile
    }
  }
}

开发者社区平台

// 开发者社区用户验证
discord: {
  clientId: process.env.DISCORD_CLIENT_ID,
  clientSecret: process.env.DISCORD_CLIENT_SECRET,
  async mapProfileToUser(profile) {
    // 验证开发者身份
    const isDeveloper = await verifyDeveloperStatus(profile.id)
    
    return {
      developerStatus: isDeveloper,
      discordMemberSince: await getJoinDate(profile.id),
      // 社区信誉系统
      communityReputation: calculateReputation(profile.id)
    }
  }
}

故障排除指南

常见问题及解决方案

问题原因解决方案
无效的重定向URIDiscord应用配置错误检查重定向URI是否完全匹配
权限不足作用域配置错误确认请求的作用域已启用
令牌过期刷新令牌失效重新发起认证流程
速率限制API调用过于频繁实现指数退避重试机制

调试模式

// 启用详细日志
const auth = betterAuth({
  socialProviders: {
    discord: {
      clientId: process.env.DISCORD_CLIENT_ID,
      clientSecret: process.env.DISCORD_CLIENT_SECRET,
      // 启用调试
      debug: process.env.NODE_ENV === "development"
    }
  },
  // 全局调试设置
  debug: true
})

性能优化建议

1. 令牌缓存

// 实现令牌缓存机制
const tokenCache = new Map()

discord: {
  clientId: process.env.DISCORD_CLIENT_ID,
  clientSecret: process.env.DISCORD_CLIENT_SECRET,
  async getUserInfo(token) {
    const cacheKey = `discord:${token.accessToken}`
    if (tokenCache.has(cacheKey)) {
      return tokenCache.get(cacheKey)
    }
    
    const userInfo = await fetchUserInfo(token.accessToken)
    tokenCache.set(cacheKey, userInfo)
    return userInfo
  }
}

2. 批量请求处理

对于需要获取多个用户信息的场景,可以实现批量处理:

async function batchGetDiscordProfiles(userIds: string[]) {
  // 实现批量获取逻辑
  const profiles = await Promise.all(
    userIds.map(id => getDiscordProfile(id))
  )
  return profiles
}

总结

Better Auth的Discord认证集成提供了完整、安全且高度可定制的解决方案。通过简单的配置即可实现:

  • ✅ 完整的OAuth 2.0认证流程
  • ✅ 类型安全的用户信息处理
  • ✅ 自动化的令牌管理
  • ✅ 灵活的作用域配置
  • ✅ 强大的错误处理机制
  • ✅ 性能优化支持

无论是游戏社区、开发者平台还是普通Web应用,Better Auth都能为Discord认证提供企业级的解决方案,让开发者专注于业务逻辑而非认证基础设施的构建。

【免费下载链接】better-auth The most comprehensive authentication framework for TypeScript 【免费下载链接】better-auth 项目地址: https://gitcode.com/GitHub_Trending/be/better-auth

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值