Skip to content
Auth

使用 X / 推特登录

要在你的项目中启用 X / Twitter 身份验证,你需要设置一个 X OAuth 2.0 应用,并在 Supabase 仪表板中添加应用凭据。

🌐 To enable X / Twitter Auth for your project, you need to set up an X OAuth 2.0 application and add the application credentials in the Supabase Dashboard.

概览 #

🌐 Overview

为你的应用设置 X / Twitter 登录包括三个部分:

🌐 Setting up X / Twitter logins for your application consists of 3 parts:

访问你的 X 开发者账号 #

🌐 Access your X developer account

找到你的回调网址 #

🌐 Find your callback URL

下一步需要一个回调 URL,看起来像这样:https://<project-ref>.supabase.co/auth/v1/callback

  • 前往你的 Supabase 项目仪表板
  • 点击左侧边栏的 Authentication 图标
  • 在配置部分点击Sign In / Providers
  • 点击手风琴列表中的 X / Twitter (OAuth 2.0) 展开,你就会找到你的 回调 URL,你可以点击 Copy 将其复制到剪贴板

本地开发 #

🌐 Local development

在本地使用 Supabase CLI 测试 OAuth 时,确保你的 OAuth 提供商已配置本地 Supabase Auth 回调 URL:

🌐 When testing OAuth locally with the Supabase CLI, ensure your OAuth provider is configured with the local Supabase Auth callback URL:

http://localhost:54321/auth/v1/callback

如果这个回调 URL 缺失或配置错误,OAuth 登录可能会失败,或者在本地开发时无法正确跳转。

🌐 If this callback URL is missing or misconfigured, OAuth sign-in may fail or not redirect correctly during local development.

有关更多详情,请查看本地开发文档

🌐 See the local development docs for more details.

要在本地使用 Supabase CLI 测试 OAuth,请参阅本地开发文档

🌐 For testing OAuth locally with the Supabase CLI see the local development docs.

创建一个 X OAuth 应用 #

🌐 Create an X OAuth app

  • 点击 + Create Project
    • 输入你的项目名称,然后点击 Next
    • 选择你的使用场景,然后点击 Next
    • 输入你的项目描述,然后点击 Next
    • 为你的应用输入一个名字,然后点击 Next
    • 复制并保存你的 API KeyAPI Secret Key(这些用于 OAuth 1.0a,正在被淘汰)。
    • 点击 App settings 继续下一步。
  • 在底部,你会看到User authentication settings。点击Set up
  • User authentication settings 下,你可以配置 App permissions
  • 确保你把 Request email from users 打开。
  • Web App... 选作 Type of App
  • App info 下配置以下内容。
    • 输入你的 Callback URL。查看上面的 查找你的回调 URL 部分,了解如何获取你的回调 URL。
    • 输入你的Website URL(提示:开发时可以尝试用http://127.0.0.1:porthttp://www.localhost:port
    • 输入你的 Terms of service URL
    • 输入你的 Privacy policy URL
  • 点击 Save
  • 保存后,前往你应用页面的 Keys and tokens
    • 滚动到页面底部并复制你的客户端ID
    • 点击 Client Secret 旁边的 Regenerate 按钮。
    • 在确认弹窗中,点击 Yes, regenerate
    • 复制并保存你的客户端密钥

在你的 Supabase 项目中输入你的 X 凭证 #

🌐 Enter your X credentials into your Supabase project

  • 前往你的 Supabase 项目仪表板
  • 在左侧边栏,点击Authentication图标(靠近顶部)
  • 在配置部分点击Providers
  • 从手风琴列表中点击 X / Twitter (OAuth 2.0) 来展开,然后将 X / Twitter (OAuth 2.0) 启用 切换为开启
  • 输入你在上一步保存的 X / Twitter (OAuth 2.0) 客户端 IDX / Twitter (OAuth 2.0) 客户端密钥
  • 点击 Save

你也可以使用管理 API 配置 X / Twitter(OAuth 2.0)认证提供者:

🌐 You can also configure the X / Twitter (OAuth 2.0) auth provider using the Management API:

1
# Get your access token from https://supabase.com/dashboard/account/tokens
2
export SUPABASE_ACCESS_TOKEN="your-access-token"
3
export PROJECT_REF="your-project-ref"
4
5
# Configure X / Twitter (OAuth 2.0) auth provider
6
curl -X PATCH "https://api.supabase.com/v1/projects/$PROJECT_REF/config/auth" \
7
-H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
8
-H "Content-Type: application/json" \
9
-d '{
10
"external_x_enabled": true,
11
"external_x_client_id": "your-x-client-id",
12
"external_x_secret": "your-x-client-secret"
13
}'

在你的客户端应用中添加登录代码 #

🌐 Add login code to your client app

当你的用户登录时,用 x 作为 provider 调用 signInWithOAuth()

🌐 When your user signs in, call signInWithOAuth() with x as the provider:

1
import { createClient } from '@supabase/supabase-js'
2
3
const supabase = createClient('https://your-project-id.supabase.co', 'sb_publishable_...')
4
5
// ---cut---
6
async function signInWithX() {
7
const { data, error } = await supabase.auth.signInWithOAuth({
8
provider: 'x',
9
})
10
}

以 PKCE 流程为例,比如在服务端认证中,你需要一个额外的步骤来处理代码交换。在调用 signInWithOAuth 时,提供一个指向回调路由的 redirectTo URL。这个重定向 URL 应该添加到你的 重定向允许列表 中。

🌐 For a PKCE flow, for example in Server-Side Auth, you need an extra step to handle the code exchange. When calling signInWithOAuth, provide a redirectTo URL which points to a callback route. This redirect URL should be added to your redirect allow list.

在浏览器中,signInWithOAuth 会自动重定向到 OAuth 提供商的认证端点,然后再重定向到你的端点。

🌐 In the browser, signInWithOAuth automatically redirects to the OAuth provider's authentication endpoint, which then redirects to your endpoint.

1
import { createClient, type Provider } from '@supabase/supabase-js';
2
const supabase = createClient('https://your-project-id.supabase.co', 'sb_publishable_...')
3
const provider = 'provider' as Provider
4
5
// ---cut---
6
await supabase.auth.signInWithOAuth({
7
provider,
8
options: {
9
redirectTo: `http://example.com/auth/callback`,
10
},
11
})

在回调端点,处理代码交换以保存用户会话。

🌐 At the callback endpoint, handle the code exchange to save the user session.

app/auth/callback/route.ts 创建一个新文件,并填入以下内容:

🌐 Create a new file at app/auth/callback/route.ts and populate with the following:

app/auth/callback/route.ts
1
import { NextResponse } from 'next/server'
2
3
// The client you created from the Server-Side Auth instructions
4
import { createClient } from '@/utils/supabase/server'
5
6
export async function GET(request: Request) {
7
const { searchParams, origin } = new URL(request.url)
8
const code = searchParams.get('code')
9
// if "next" is in param, use it as the redirect URL
10
let next = searchParams.get('next') ?? '/'
11
if (!next.startsWith('/')) {
12
// if "next" is not a relative URL, use the default
13
next = '/'
14
}
15
16
if (code) {
17
const supabase = await createClient()
18
const { error } = await supabase.auth.exchangeCodeForSession(code)
19
if (!error) {
20
const forwardedHost = request.headers.get('x-forwarded-host') // original origin before load balancer
21
const isLocalEnv = process.env.NODE_ENV === 'development'
22
if (isLocalEnv) {
23
// we can be sure that there is no load balancer in between, so no need to watch for X-Forwarded-Host
24
return NextResponse.redirect(`${origin}${next}`)
25
} else if (forwardedHost) {
26
return NextResponse.redirect(`https://${forwardedHost}${next}`)
27
} else {
28
return NextResponse.redirect(`${origin}${next}`)
29
}
30
}
31
}
32
33
// return the user to an error page with instructions
34
return NextResponse.redirect(`${origin}/auth/auth-code-error`)
35
}

当你的用户注销时,调用 signOut() 来将他们从浏览器会话中移除,并清除 localStorage 中的任何对象:

🌐 When your user signs out, call signOut() to remove them from the browser session and any objects from localStorage:

1
import { createClient } from '@supabase/supabase-js'
2
3
const supabase = createClient('https://your-project-id.supabase.co', 'sb_publishable_...')
4
5
// ---cut---
6
async function signOut() {
7
const { error } = await supabase.auth.signOut()
8
}

资源 #

🌐 Resources