苹果

获取你的 OAuth 凭证

要使用 Apple 登录,你需要一个客户端 ID 和客户端密钥。你可以从 Apple 开发者门户 获取它们。

你需要一个活跃的Apple 开发者账号才能访问开发者门户并生成这些凭证。

请按照以下步骤设置你的应用 ID、服务 ID,并生成客户端密钥所需的密钥:

  1. 导航到证书、标识符与描述文件: 在 Apple 开发者门户中,进入“证书、标识符与描述文件”部分。

  2. 创建应用ID:

    • 转到 Identifiers 选项卡。
    • 点击标识符旁边的 + 图标。
    • 选择 App IDs,然后点击 Continue
    • 选择“应用”作为类型,然后点击“继续”。
    • 描述: 输入你的应用名称(例如,“我的超棒应用”)。当用户登录时,该名称可能会显示给他们。
    • 应用包 ID: 设置一个应用包 ID。推荐的格式是反向域名(例如,com.yourcompany.yourapp)。使用像 .ai 这样的后缀(用于应用标识符)可以帮助组织,但不是必需的(例如,com.yourcompany.yourapp.ai)。
    • 向下滚动到 功能。勾选 使用 Apple 登录 的复选框。
    • 点击 Continue,然后点击 Register
  3. 创建服务 ID:

    • 返回到“标识符”标签。
    • 点击 + 图标。
    • 选择 Service IDs,然后点击 Continue
    • 描述: 输入此服务的描述(例如,再次输入你的应用名称)。
    • 标识符: 为服务设置唯一标识符。使用反向域名格式,需与你的应用 ID 不同(例如 com.yourcompany.yourapp.si,其中 .si 表示服务标识符——这是为你的组织而设,并非必需)。此服务 ID 将成为你的 clientId
    • 点击 Continue,然后点击 Register
  4. 配置服务ID:

    • Identifiers 列表中找到你刚创建的服务 ID,然后点击它。
    • 勾选“使用 Apple 登录”功能,然后点击“配置”。
    • Primary App ID 下,选择你之前创建的 App ID(例如,com.yourcompany.yourapp.ai)。
    • Domains and Subdomains 下,列出你将用于使用 Apple 登录的所有根域(例如,example.comanotherdomain.com)。
    • Return URLs 下,输入回调 URL。https://yourdomain.com/api/auth/callback/apple。添加所有必要的返回 URL。
    • 点击 Next,然后点击 Done
    • 点击 Continue,然后点击 Save
  5. 创建客户端密钥:

    • 转到 Keys 标签。
    • 点击 + 图标以创建新密钥。
    • 密钥名称: 输入密钥的名称(例如,“使用苹果登录密钥”)。
    • 向下滚动并勾选“使用 Apple 登录”的复选框。
    • 点击“使用 Apple 登录”旁边的“配置”按钮。
    • 选择你之前创建的主要应用 ID
    • 点击 Save,然后点击 Continue,再点击 Register
    • 下载密钥: 立即下载 .p8 密钥文件。**此文件仅可下载一次。**记下密钥 ID(创建后可在密钥页面查看)和团队 ID(可在你的 Apple 开发者账户设置中查看)。
  6. 生成客户端密钥(JWT): Apple 要求使用下载的 .p8 密钥、Key ID 和你的团队 ID 动态生成 JSON Web Token(JWT)。此 JWT 用作你的 clientSecret

    你可以使用下面的指南(来自 Apple 文档)来了解如何生成此客户端密钥。你也可以使用我们内置的生成器如下生成“使用 Apple 登录”所需的客户端密钥 JWT。

    注意: Apple 允许客户端密钥 JWT 的最大有效期为 6 个月(180 天)。你需要在其过期前重新生成客户端密钥,以保持认证不中断。

配置提供程序

要配置提供程序,你需要将其添加到 auth 实例的 socialProviders 选项中。

你还需要将 https://appleid.apple.com 添加到你的身份验证实例配置中的 trustedOrigins 数组,以允许与苹果的身份验证服务器进行通信。

auth.ts
import { betterAuth } from "better-auth"

export const auth = betterAuth({
    socialProviders: {
        apple: { 
            clientId: process.env.APPLE_CLIENT_ID as string, 
            clientSecret: process.env.APPLE_CLIENT_SECRET as string, 
            // Optional
            appBundleIdentifier: process.env.APPLE_APP_BUNDLE_IDENTIFIER as string, 
        }, 
    },
    // Add appleid.apple.com to trustedOrigins for Sign In with Apple flows
    trustedOrigins: ["https://appleid.apple.com"], 
})

在原生 iOS 上,它不使用服务 ID,而是使用应用 ID(包 ID)作为客户端 ID,所以如果在 signIn.social 中使用 idToken 时将服务 ID 作为 clientId,会抛出错误:JWTClaimValidationFailed: unexpected "aud" claim value。因此,当你想使用 Apple 的 ID Token 登录时,需要提供 appBundleIdentifier

本地主机和非 TLS 限制

Apple 登录 支持 localhost 或非 HTTPS 的 URL。在开发过程中:

  • 不能使用 http://localhost 作为返回 URL
  • 必须使用具有有效 HTTPS/TLS 证书的域名

【Apple Sign In does not support localhost or non-HTTPS URLs. During development:

  • You cannot use http://localhost as a return URL
  • You must use a domain with valid HTTPS/TLS certificate】

此限制是由苹果的安全要求强制执行的,无法绕过。

用法

【Usage】

使用 Apple 登录

【Sign In with Apple】

要使用 Apple 登录,你可以使用客户端提供的 signIn.social 函数。signIn 函数接受一个包含以下属性的对象:

  • provider:要使用的提供者。应设置为 apple

【To sign in with Apple, you can use the signIn.social function provided by the client. The signIn function takes an object with the following properties:

  • provider: The provider to use. It should be set to apple.】
auth-client.ts
import { createAuthClient } from "better-auth/client"
const authClient =  createAuthClient()

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

使用 Apple 登录并获取 ID 令牌

【Sign In with Apple With ID Token】

要使用 ID 令牌通过 Apple 登录,你可以使用 signIn.social 函数传递 ID 令牌。

【To sign in with Apple using the ID Token, you can use the signIn.social function to pass the ID Token. 】

当你在客户端拥有 Apple 的 ID 令牌并希望在服务器上使用它登录时,这非常有用。

【This is useful when you have the ID Token from Apple on the client-side and want to use it to sign in on the server.】

如果提供了 ID 令牌,将不会进行重定向,用户将直接登录。

auth-client.ts
await authClient.signIn.social({
    provider: "apple",
    idToken: {
        token: // Apple ID Token,
        nonce: // Nonce (optional)
        accessToken: // Access Token (optional)
    }
})

生成苹果客户端密钥(JWT)

【Generate Apple Client Secret (JWT)】

The identifier for the service you created in Apple Developer.

The ID associated with your private key (.p8 file).

Paste the entire content of your .p8 private key file here. Ensure it's in PKCS#8 format.

On this page