# Slack (/docs/authentication/slack)

Slack 提供者的设置和使用说明。



<Steps>
  <Step>
    ### 获取你的 Slack 凭证 [#获取你的-slack-凭证]

    要使用 Slack 作为社交提供者，你需要创建一个 Slack 应用并获取你的凭证。

    1. 前往 [Slack API 的应用页面](https://api.slack.com/apps) 并点击“创建新应用”
    2. 选择“从零开始”，为你的应用命名并选择一个开发工作区
    3. 在应用设置中，导航到“OAuth & Permissions”
    4. 在“重定向 URL”下，添加你的重定向 URL：
       * 开发环境：`http://localhost:3000/api/auth/callback/slack`
       * 生产环境：`https://yourdomain.com/api/auth/callback/slack`
    5. 从“基本信息”页面复制你的客户端 ID 和客户端密钥

    <Callout>
      在生产环境中，Slack 要求重定向 URL 使用 HTTPS。在本地开发时，你可以使用 [ngrok](https://ngrok.com/) 等工具创建安全隧道。
    </Callout>
  </Step>

  <Step>
    ### 配置提供者 [#配置提供者]

    要配置该提供者，需要将 `clientId` 和 `clientSecret` 传递给 `socialProviders.slack`：

    ```ts title="auth.ts"
    import { betterAuth } from "better-auth"

    export const auth = betterAuth({
        socialProviders: {
            slack: { // [!code highlight]
                clientId: process.env.SLACK_CLIENT_ID as string, // [!code highlight]
                clientSecret: process.env.SLACK_CLIENT_SECRET as string, // [!code highlight]
            }, // [!code highlight]
        },
    })
    ```
  </Step>
</Steps>

## 使用 [#使用]

### 使用 Slack 登录 [#使用-slack-登录]

要使用 Slack 登录，可以调用客户端提供的 `signIn.social` 函数。`signIn` 接受一个包含以下属性的对象：

* `provider`：要使用的提供者，应设置为 `slack`。

```ts title="auth-client.ts"
import { createAuthClient } from "better-auth/client";
const authClient = createAuthClient();

const signIn = async () => {
  const data = await authClient.signIn.social({ provider: "slack" });
};
```

### 请求额外权限范围 [#请求额外权限范围]

默认情况下，Slack 使用 OpenID Connect 权限范围：`openid`、`profile` 和 `email`。你可以在登录时请求额外的 Slack 权限：

```ts title="auth-client.ts"
const signInWithSlack = async () => {
  await authClient.signIn.social({
    provider: "slack",
    scopes: ["channels:read", "chat:write"], // 额外的 Slack API 权限
  });
};
```

### 限定工作区登录 [#限定工作区登录]

如果你想限制登录到特定的 Slack 工作区，可以传递 `team` 参数：

```ts title="auth.ts"
socialProviders: {
    slack: {
        clientId: process.env.SLACK_CLIENT_ID as string,
        clientSecret: process.env.SLACK_CLIENT_SECRET as string,
        team: "T1234567890", // 你的 Slack 工作区 ID
    },
}
```

### 登录后使用 Slack API [#登录后使用-slack-api]

认证成功后，你可以通过会话访问用户的 Slack 信息。访问令牌可用于向 Slack API 发起请求：

```ts
const session = await authClient.getSession();
if (session?.user) {
  // 访问 Slack 特定数据
  const slackUserId = session.user.id; // 这是 Slack 用户 ID
  // 访问令牌安全存储于服务器端
}
```

<Callout>
  Slack 提供者默认使用 OpenID Connect，它提供了基础的用户信息。如果需要访问其他 Slack API，请确保在登录时请求相应的权限范围。
</Callout>

