# Railway (/docs/authentication/railway)

Railway 提供者设置和使用方法。



<Steps>
  <Step>
    ### 获取您的 Railway 凭证 [#获取您的-railway-凭证]

    要使用 Railway 登录，您需要客户端 ID 和客户端密钥。您可以从 [Railway 开发者设置](https://railway.com/workspace/developer) 获取它们。

    1. 进入您的 Railway 账户的开发者设置
    2. 点击“创建 OAuth 应用”
    3. 将应用程序类型设置为“Web 应用程序”
    4. 将重定向 URL 设置为 `http://localhost:3000/api/auth/callback/railway`（本地开发），或生产环境中的应用 URL

    请务必安全地保存您的客户端 ID 和客户端密钥。如果更改了认证路由的基础路径，请相应更新重定向 URL。

    <Callout type="info">
      Railway 使用 PKCE（代码交换的密钥）来增强安全性。此功能由 Better Auth 自动处理。
    </Callout>
  </Step>

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

    要配置该提供者，您需要导入提供者并将其传递给认证实例的 `socialProviders` 选项。

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

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

## 使用方法 [#使用方法]

### 使用 Railway 登录 [#使用-railway-登录]

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

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

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

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

## 选项 [#选项]

有关所有社交提供者支持的完整选项列表，请参见 [提供者选项](/docs/concepts/oauth#提供商选项)。

### 可用权限范围 [#可用权限范围]

Railway OAuth 支持以下权限范围：

| 权限范围               | 描述                |
| ------------------ | ----------------- |
| `openid`           | 所有请求必需（默认包含）      |
| `email`            | 访问用户的电子邮件地址（默认包含） |
| `profile`          | 访问用户的姓名和头像（默认包含）  |
| `offline_access`   | 接收刷新令牌以实现长期访问     |
| `workspace:viewer` | 查看用户选择的工作区        |
| `workspace:member` | 成员权限访问用户选择的工作区    |
| `workspace:admin`  | 管理员权限访问用户选择的工作区   |
| `project:viewer`   | 查看用户选择的项目         |
| `project:member`   | 成员权限访问用户选择的项目     |

当请求工作区或项目权限时，用户将在授权同意界面选择具体要共享的工作区或项目。

您可以在配置提供者时指定额外的权限范围：

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

export const auth = betterAuth({
    socialProviders: {
        railway: {
            clientId: process.env.RAILWAY_CLIENT_ID as string,
            clientSecret: process.env.RAILWAY_CLIENT_SECRET as string,
            scope: ["workspace:viewer", "project:viewer"], // [!code highlight]
        },
    },
})
```

<Callout type="warn">
  当请求 `offline_access` 权限范围时，Railway 要求在授权 URL 中设置 `prompt=consent`：

  ```ts
  railway: {
      clientId: process.env.RAILWAY_CLIENT_ID as string,
      clientSecret: process.env.RAILWAY_CLIENT_SECRET as string,
      scope: ["offline_access"],
      prompt: "consent", // [!code highlight]
  }
  ```
</Callout>

有关 Railway OAuth 实现的更多信息，请参阅 [Railway 官方文档](https://docs.railway.com/reference/oauth/login-with-railway)。

