feat(auth): add Apple authentication provider and configuration
This commit is contained in:
@@ -15,6 +15,8 @@ NEXTAUTH_SECRET="your-super-secret-key-change-in-production"
|
|||||||
# AZURE_AD_TENANT_ID=""
|
# AZURE_AD_TENANT_ID=""
|
||||||
# GITHUB_CLIENT_ID=your_client_id
|
# GITHUB_CLIENT_ID=your_client_id
|
||||||
# GITHUB_CLIENT_SECRET=your_client_secret
|
# GITHUB_CLIENT_SECRET=your_client_secret
|
||||||
|
# AUTH_APPLE_ID=""
|
||||||
|
# AUTH_APPLE_SECRET=""
|
||||||
|
|
||||||
# ENABLED_STORAGE="do-spaces" | "s3" | "url"
|
# ENABLED_STORAGE="do-spaces" | "s3" | "url"
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -29,9 +29,9 @@ export default defineConfig({
|
|||||||
|
|
||||||
// Authentication plugins
|
// Authentication plugins
|
||||||
auth: {
|
auth: {
|
||||||
// Available: "credentials" | "google" | "azure" | "github" | custom
|
// Available: "credentials" | "google" | "azure" | "github" | "apple" | custom
|
||||||
// Use `providers` array to enable multiple auth providers
|
// Use `providers` array to enable multiple auth providers
|
||||||
providers: ["github", "google"],
|
providers: ["github", "google", "apple"],
|
||||||
// Allow public registration (only applies to credentials provider)
|
// Allow public registration (only applies to credentials provider)
|
||||||
allowRegistration: false,
|
allowRegistration: false,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ const providerNames: Record<string, string> = {
|
|||||||
github: "GitHub",
|
github: "GitHub",
|
||||||
google: "Google",
|
google: "Google",
|
||||||
azure: "Microsoft",
|
azure: "Microsoft",
|
||||||
|
apple: "Apple",
|
||||||
credentials: "Email",
|
credentials: "Email",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ const providerIcons: Record<string, React.ReactNode> = {
|
|||||||
<path d="M5.483 21.3H24L14.025 4.013l-3.038 8.347 5.836 6.938L5.483 21.3zM13.23 2.7L6.105 8.677 0 19.253h5.505l7.725-16.553z"/>
|
<path d="M5.483 21.3H24L14.025 4.013l-3.038 8.347 5.836 6.938L5.483 21.3zM13.23 2.7L6.105 8.677 0 19.253h5.505l7.725-16.553z"/>
|
||||||
</svg>
|
</svg>
|
||||||
),
|
),
|
||||||
|
apple: (
|
||||||
|
<svg className="h-4 w-4" viewBox="0 0 24 24" fill="currentColor">
|
||||||
|
<path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"/>
|
||||||
|
</svg>
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
export function OAuthButton({ provider, providerName }: OAuthButtonProps) {
|
export function OAuthButton({ provider, providerName }: OAuthButtonProps) {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export interface ThemeConfig {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export type AuthProvider = "credentials" | "google" | "azure" | "github" | string;
|
export type AuthProvider = "credentials" | "google" | "azure" | "github" | "apple" | string;
|
||||||
|
|
||||||
export interface AuthConfig {
|
export interface AuthConfig {
|
||||||
/** @deprecated Use `providers` array instead */
|
/** @deprecated Use `providers` array instead */
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import Apple from "next-auth/providers/apple";
|
||||||
|
import type { AuthPlugin } from "../types";
|
||||||
|
|
||||||
|
export const applePlugin: AuthPlugin = {
|
||||||
|
id: "apple",
|
||||||
|
name: "Apple",
|
||||||
|
getProvider: () =>
|
||||||
|
Apple({
|
||||||
|
clientId: process.env.AUTH_APPLE_ID!,
|
||||||
|
clientSecret: process.env.AUTH_APPLE_SECRET!,
|
||||||
|
profile(profile) {
|
||||||
|
return {
|
||||||
|
id: profile.sub,
|
||||||
|
name: profile.name?.firstName
|
||||||
|
? `${profile.name.firstName} ${profile.name.lastName || ""}`.trim()
|
||||||
|
: profile.email?.split("@")[0] || "User",
|
||||||
|
email: profile.email,
|
||||||
|
image: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
};
|
||||||
@@ -3,6 +3,7 @@ import { credentialsPlugin } from "./credentials";
|
|||||||
import { googlePlugin } from "./google";
|
import { googlePlugin } from "./google";
|
||||||
import { azurePlugin } from "./azure";
|
import { azurePlugin } from "./azure";
|
||||||
import { githubPlugin } from "./github";
|
import { githubPlugin } from "./github";
|
||||||
|
import { applePlugin } from "./apple";
|
||||||
|
|
||||||
// Register all built-in auth plugins
|
// Register all built-in auth plugins
|
||||||
export function registerBuiltInAuthPlugins(): void {
|
export function registerBuiltInAuthPlugins(): void {
|
||||||
@@ -10,6 +11,7 @@ export function registerBuiltInAuthPlugins(): void {
|
|||||||
registerAuthPlugin(googlePlugin);
|
registerAuthPlugin(googlePlugin);
|
||||||
registerAuthPlugin(azurePlugin);
|
registerAuthPlugin(azurePlugin);
|
||||||
registerAuthPlugin(githubPlugin);
|
registerAuthPlugin(githubPlugin);
|
||||||
|
registerAuthPlugin(applePlugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { credentialsPlugin, googlePlugin, azurePlugin, githubPlugin };
|
export { credentialsPlugin, googlePlugin, azurePlugin, githubPlugin, applePlugin };
|
||||||
Reference in New Issue
Block a user