苹果
获取你的 OAuth 凭证
要使用 Apple 登录,你需要一个客户端 ID 和客户端密钥。你可以从 Apple 开发者门户 获取它们。
你需要一个活跃的Apple 开发者账号才能访问开发者门户并生成这些凭证。
请按照以下步骤设置你的应用 ID、服务 ID,并生成客户端密钥所需的密钥:
-
导航到证书、标识符与描述文件: 在 Apple 开发者门户中,进入“证书、标识符与描述文件”部分。
-
创建应用ID:
- 转到
Identifiers选项卡。 - 点击标识符旁边的
+图标。 - 选择
App IDs,然后点击Continue。 - 选择“应用”作为类型,然后点击“继续”。
- 描述: 输入你的应用名称(例如,“我的超棒应用”)。当用户登录时,该名称可能会显示给他们。
- 应用包 ID: 设置一个应用包 ID。推荐的格式是反向域名(例如,
com.yourcompany.yourapp)。使用像.ai这样的后缀(用于应用标识符)可以帮助组织,但不是必需的(例如,com.yourcompany.yourapp.ai)。 - 向下滚动到 功能。勾选
使用 Apple 登录的复选框。 - 点击
Continue,然后点击Register。
- 转到
-
创建服务 ID:
- 返回到“标识符”标签。
- 点击
+图标。 - 选择
Service IDs,然后点击Continue。 - 描述: 输入此服务的描述(例如,再次输入你的应用名称)。
- 标识符: 为服务设置唯一标识符。使用反向域名格式,需与你的应用 ID 不同(例如
com.yourcompany.yourapp.si,其中.si表示服务标识符——这是为你的组织而设,并非必需)。此服务 ID 将成为你的clientId。 - 点击
Continue,然后点击Register。
-
配置服务ID:
- 在
Identifiers列表中找到你刚创建的服务 ID,然后点击它。 - 勾选“使用 Apple 登录”功能,然后点击“配置”。
- 在 Primary App ID 下,选择你之前创建的 App ID(例如,
com.yourcompany.yourapp.ai)。 - 在 Domains and Subdomains 下,列出你将用于使用 Apple 登录的所有根域(例如,
example.com、anotherdomain.com)。 - 在 Return URLs 下,输入回调 URL。
https://yourdomain.com/api/auth/callback/apple。添加所有必要的返回 URL。 - 点击
Next,然后点击Done。 - 点击
Continue,然后点击Save。
- 在
-
创建客户端密钥:
- 转到
Keys标签。 - 点击
+图标以创建新密钥。 - 密钥名称: 输入密钥的名称(例如,“使用苹果登录密钥”)。
- 向下滚动并勾选“使用 Apple 登录”的复选框。
- 点击“使用 Apple 登录”旁边的“配置”按钮。
- 选择你之前创建的主要应用 ID。
- 点击
Save,然后点击Continue,再点击Register。 - 下载密钥: 立即下载
.p8密钥文件。**此文件仅可下载一次。**记下密钥 ID(创建后可在密钥页面查看)和团队 ID(可在你的 Apple 开发者账户设置中查看)。
- 转到
-
生成客户端密钥(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 数组,以允许与苹果的身份验证服务器进行通信。
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。在开发过程中:
🌐 Apple Sign In does not support localhost or non-HTTPS URLs. During development:
- 你不能将
http://localhost用作返回 URL - 你必须使用拥有有效 HTTPS/TLS 证书的域名
此限制是由苹果的安全要求强制执行的,无法绕过。
用法
🌐 Usage
使用 Apple 登录
🌐 Sign In with Apple
要使用 Apple 登录,你可以使用客户端提供的 signIn.social 函数。signIn 函数接受一个具有以下属性的对象:
🌐 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:要使用的提供者。应设置为apple。
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 令牌,将不会进行重定向,用户将直接登录。
await authClient.signIn.social({
provider: "apple",
idToken: {
token: // Apple ID Token,
nonce: // Nonce (optional)
accessToken: // Access Token (optional)
}
})生成苹果客户端密钥(JWT)
🌐 Generate Apple Client Secret (JWT)