用 Slack 登录
要为你的项目启用 Slack 认证,你需要设置一个 Slack OAuth 应用,并把应用的凭证添加到你的 Supabase 控制面板。
🌐 To enable Slack Auth for your project, you need to set up a Slack OAuth application and add the application credentials to your Supabase Dashboard.
概览 #
🌐 Overview
我们将用新的 Slack(OIDC)提供商替换现有的 Slack 提供商。在 2024 年 6 月 24 日之前创建的 Slack OAuth 应用的开发者应该创建一个新应用,并将凭证从 Slack 提供商迁移到 Slack(OIDC)提供商。使用旧 Slack 提供商构建的现有 OAuth 应用将在 10 月 10 日之前继续可用。你可以参考支持的权限列表了解新的 Slack(OIDC)用户。
🌐 We will be replacing the existing Slack provider with a new Slack (OIDC) provider. Developers with Slack OAuth Applications created prior to 24th June 2024 should create a new application and migrate their credentials from the Slack provider to the Slack (OIDC) provider. Existing OAuth Applications built with the old Slack provider will continue to work up till 10th October. You can refer to the list of supported scopes for the new Slack (OIDC) User.
为你的应用设置 Slack 登录分为三个部分:
🌐 Setting up Slack logins for your application consists of 3 parts:
- 在 Slack 开发者控制台 上创建并配置一个 Slack 项目和应用。
- 将你的 Slack
API Key和API Secret Key添加到你的 Supabase 项目。 - 将登录代码添加到你的 Supabase JS 客户端应用 中。
访问你的 Slack 开发者账号 #
🌐 Access your Slack Developer account
- 去 api.slack.com 。
- 点击右上角的
Your Apps登录。

找到你的回调网址 #
🌐 Find your callback URL
下一步需要一个回调 URL,看起来像这样:https://<project-ref>.supabase.co/auth/v1/callback
- 前往你的 Supabase 项目仪表板
- 点击左侧边栏的
Authentication图标 - 在配置部分点击
Sign In / Providers - 点击手风琴列表中的 Slack 展开,你就会找到你的 回调 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.
创建一个 Slack OAuth 应用 #
🌐 Create a Slack OAuth app
- 去 api.slack.com 。
- 点击
Create New App
在 Create an app... 下:
🌐 Under Create an app...:
- 点击
From scratch - 输入你的应用名称
- 选择你的
Slack Workspace - 点击
Create App
在 App Credentials 下:
🌐 Under App Credentials:
- 复制并保存你新生成的
Client ID - 复制并保存你新生成的
Client Secret
在侧边栏下,选择 OAuth & Permissions 并查找 Redirect URLs:
🌐 Under the sidebar, select OAuth & Permissions and look for Redirect URLs:
- 点击
Add New Redirect URL - 粘贴你的
Callback URL然后点击Add - 点击
Save URLs
在 Scopes 下:
🌐 Under Scopes:
- 在
User Token Scopes下添加以下范围:profile、email、openid。这些范围是 Supabase Auth 用来请求用户信息的默认范围。不要添加其他范围,因为使用 Slack 登录只支持profile、email、openid。
在你的 Supabase 项目中输入你的 Slack 凭证 #
🌐 Enter your Slack credentials into your Supabase project
- 前往你的 Supabase 项目仪表板
- 在左侧边栏,点击
Authentication图标(靠近顶部) - 在配置部分点击
Providers - 从手风琴列表中点击 Slack 来展开,然后将 Slack 启用 切换为开启
- 输入你在上一步保存的 Slack 客户端 ID 和 Slack 客户端密钥
- 点击
Save
你也可以使用管理 API 配置 Slack(OIDC)认证提供者:
🌐 You can also configure the Slack (OIDC) auth provider using the Management API:
1# Get your access token from https://supabase.com/dashboard/account/tokens2export SUPABASE_ACCESS_TOKEN="your-access-token"3export PROJECT_REF="your-project-ref"45# Configure Slack (OIDC) auth provider6curl -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_slack_oidc_enabled": true,11 "external_slack_oidc_client_id": "your-slack-client-id",12 "external_slack_oidc_secret": "your-slack-client-secret"13 }'在你的客户端应用中添加登录代码 #
🌐 Add login code to your client app
确保你在以下代码中使用了正确的 supabase 客户端。
🌐 Make sure you're using the right supabase client in the following code.
如果你没有使用服务器端渲染或基于 Cookie 的认证,你可以直接从 @supabase/supabase-js 使用 createClient。如果你在使用服务器端渲染,请查看 服务器端认证指南 获取创建 Supabase 客户端的说明。
🌐 If you're not using Server-Side Rendering or cookie-based Auth, you can directly use the createClient from @supabase/supabase-js. If you're using Server-Side Rendering, see the Server-Side Auth guide for instructions on creating your Supabase client.
当你的用户登录时,用 slack_oidc 作为 provider 调用 signInWithOAuth() :
🌐 When your user signs in, call signInWithOAuth() with slack_oidc as the provider:
1import { createClient } from '@supabase/supabase-js'23const supabase = createClient('https://your-project-id.supabase.co', 'sb_publishable_...')45// ---cut---6async function signInWithSlack() {7 const { data, error } = await supabase.auth.signInWithOAuth({8 provider: 'slack_oidc',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.
1import { createClient, type Provider } from '@supabase/supabase-js';2const supabase = createClient('https://your-project-id.supabase.co', 'sb_publishable_...')3const provider = 'provider' as Provider45// ---cut---6await 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:
1import { NextResponse } from 'next/server'23// The client you created from the Server-Side Auth instructions4import { createClient } from '@/utils/supabase/server'56export 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 URL10 let next = searchParams.get('next') ?? '/'11 if (!next.startsWith('/')) {12 // if "next" is not a relative URL, use the default13 next = '/'14 }1516 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 balancer21 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-Host24 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 }3233 // return the user to an error page with instructions34 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:
1import { createClient } from '@supabase/supabase-js'23const supabase = createClient('https://your-project-id.supabase.co', 'sb_publishable_...')45// ---cut---6async function signOut() {7 const { error } = await supabase.auth.signOut()8}资源 #
🌐 Resources