|
1 |
| -import NextAuth, { NextAuthOptions } from "next-auth" |
2 |
| -// import EmailProvider from "next-auth/providers/email" |
3 |
| -import GitHubProvider from "next-auth/providers/github" |
4 |
| -import Auth0Provider from "next-auth/providers/auth0" |
5 |
| -import KeycloakProvider from "next-auth/providers/keycloak" |
6 |
| -import TwitterProvider, { |
7 |
| - // TwitterLegacy as TwitterLegacyProvider, |
8 |
| -} from "next-auth/providers/twitter" |
9 |
| -import CredentialsProvider from "next-auth/providers/credentials" |
10 |
| -import IDS4Provider from "next-auth/providers/identity-server4" |
11 |
| -import DuendeIDS6Provider from "next-auth/providers/duende-identity-server6" |
12 |
| -import Twitch from "next-auth/providers/twitch" |
13 |
| -import GoogleProvider from "next-auth/providers/google" |
14 |
| -import FacebookProvider from "next-auth/providers/facebook" |
15 |
| -import FoursquareProvider from "next-auth/providers/foursquare" |
16 |
| -// import FreshbooksProvider from "next-auth/providers/freshbooks" |
17 |
| -import GitlabProvider from "next-auth/providers/gitlab" |
18 |
| -import InstagramProvider from "next-auth/providers/instagram" |
19 |
| -import LineProvider from "next-auth/providers/line" |
20 |
| -import LinkedInProvider from "next-auth/providers/linkedin" |
21 |
| -import MailchimpProvider from "next-auth/providers/mailchimp" |
22 |
| -import DiscordProvider from "next-auth/providers/discord" |
23 |
| -import AzureADProvider from "next-auth/providers/azure-ad" |
24 |
| -import SpotifyProvider from "next-auth/providers/spotify" |
25 |
| -import CognitoProvider from "next-auth/providers/cognito" |
26 |
| -import SlackProvider from "next-auth/providers/slack" |
27 |
| -import Okta from "next-auth/providers/okta" |
28 |
| -import AzureB2C from "next-auth/providers/azure-ad-b2c" |
29 |
| -import OsuProvider from "next-auth/providers/osu" |
30 |
| -import AppleProvider from "next-auth/providers/apple" |
31 |
| -import PatreonProvider from "next-auth/providers/patreon" |
32 |
| -import TraktProvider from "next-auth/providers/trakt" |
33 |
| -import WorkOSProvider from "next-auth/providers/workos" |
34 |
| -import BoxyHQSAMLProvider from "next-auth/providers/boxyhq-saml" |
35 |
| -import WikimediaProvider from "next-auth/providers/wikimedia" |
36 |
| -import VkProvider from "next-auth/providers/vk" |
37 |
| - |
38 |
| -// TypeORM |
39 |
| -// import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" |
40 |
| -// const adapter = TypeORMLegacyAdapter({ |
41 |
| -// type: "sqlite", |
42 |
| -// name: "next-auth-test-memory", |
43 |
| -// database: "./typeorm/dev.db", |
44 |
| -// synchronize: true, |
45 |
| -// }) |
| 1 | +import NextAuth from "next-auth" |
| 2 | +import type { NextAuthOptions } from "next-auth" |
46 | 3 |
|
47 |
| -// // Prisma |
48 |
| -// import { PrismaAdapter } from "@next-auth/prisma-adapter" |
49 |
| -// import { PrismaClient } from "@prisma/client" |
50 |
| -// const prisma = new PrismaClient() |
51 |
| -// const adapter = PrismaAdapter(prisma) |
| 4 | +// Providers |
| 5 | +import Apple from "next-auth/providers/apple" |
| 6 | +import Auth0 from "next-auth/providers/auth0" |
| 7 | +import AzureAD from "next-auth/providers/azure-ad" |
| 8 | +import AzureB2C from "next-auth/providers/azure-ad-b2c" |
| 9 | +import BoxyHQSAML from "next-auth/providers/boxyhq-saml" |
| 10 | +import Cognito from "next-auth/providers/cognito" |
| 11 | +import Credentials from "next-auth/providers/credentials" |
| 12 | +import Discord from "next-auth/providers/discord" |
| 13 | +import DuendeIDS6 from "next-auth/providers/duende-identity-server6" |
| 14 | +import Email from "next-auth/providers/email" |
| 15 | +import Facebook from "next-auth/providers/facebook" |
| 16 | +import Foursquare from "next-auth/providers/foursquare" |
| 17 | +import Freshbooks from "next-auth/providers/freshbooks" |
| 18 | +import GitHub from "next-auth/providers/github" |
| 19 | +import Gitlab from "next-auth/providers/gitlab" |
| 20 | +import Google from "next-auth/providers/google" |
| 21 | +import IDS4 from "next-auth/providers/identity-server4" |
| 22 | +import Instagram from "next-auth/providers/instagram" |
| 23 | +import Keycloak from "next-auth/providers/keycloak" |
| 24 | +import Line from "next-auth/providers/line" |
| 25 | +import LinkedIn from "next-auth/providers/linkedin" |
| 26 | +import Mailchimp from "next-auth/providers/mailchimp" |
| 27 | +import Okta from "next-auth/providers/okta" |
| 28 | +import Osu from "next-auth/providers/osu" |
| 29 | +import Patreon from "next-auth/providers/patreon" |
| 30 | +import Slack from "next-auth/providers/slack" |
| 31 | +import Spotify from "next-auth/providers/spotify" |
| 32 | +import Trakt from "next-auth/providers/trakt" |
| 33 | +import Twitch from "next-auth/providers/twitch" |
| 34 | +import Twitter, { TwitterLegacy } from "next-auth/providers/twitter" |
| 35 | +import Vk from "next-auth/providers/vk" |
| 36 | +import Wikimedia from "next-auth/providers/wikimedia" |
| 37 | +import WorkOS from "next-auth/providers/workos" |
52 | 38 |
|
53 |
| -// // Fauna |
54 |
| -// import { Client as FaunaClient } from "faunadb" |
55 |
| -// import { FaunaAdapter } from "@next-auth/fauna-adapter" |
56 |
| -// const client = new FaunaClient({ |
57 |
| -// secret: process.env.FAUNA_SECRET, |
58 |
| -// domain: process.env.FAUNA_DOMAIN, |
59 |
| -// }) |
60 |
| -// const adapter = FaunaAdapter(client) |
| 39 | +// Adapters |
| 40 | +import { PrismaClient } from "@prisma/client" |
| 41 | +import { PrismaAdapter } from "@next-auth/prisma-adapter" |
| 42 | +import { Client as FaunaClient } from "faunadb" |
| 43 | +import { FaunaAdapter } from "@next-auth/fauna-adapter" |
| 44 | +import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter" |
61 | 45 |
|
62 |
| -// // Dummy |
63 |
| -// const adapter: any = { |
64 |
| -// getUserByEmail: (email) => ({ id: "1", email, emailVerified: null }), |
65 |
| -// createVerificationToken: (token) => token, |
66 |
| -// } |
| 46 | +// Add an adapter you want to test here. |
| 47 | +const adapters = { |
| 48 | + prisma() { |
| 49 | + const client = globalThis.prisma || new PrismaClient() |
| 50 | + if (process.env.NODE_ENV !== "production") global.prisma = client |
| 51 | + return PrismaAdapter(client) |
| 52 | + }, |
| 53 | + typeorm() { |
| 54 | + return TypeORMLegacyAdapter({ |
| 55 | + type: "sqlite", |
| 56 | + name: "next-auth-test-memory", |
| 57 | + database: "./typeorm/dev.db", |
| 58 | + synchronize: true, |
| 59 | + }) |
| 60 | + }, |
| 61 | + fauna() { |
| 62 | + const client = |
| 63 | + globalThis.fauna || |
| 64 | + new FaunaClient({ |
| 65 | + secret: process.env.FAUNA_SECRET, |
| 66 | + domain: process.env.FAUNA_DOMAIN, |
| 67 | + }) |
| 68 | + if (process.env.NODE_ENV !== "production") global.fauna = client |
| 69 | + return FaunaAdapter(client) |
| 70 | + }, |
| 71 | + noop() { |
| 72 | + return undefined |
| 73 | + }, |
| 74 | +} |
67 | 75 |
|
68 | 76 | export const authOptions: NextAuthOptions = {
|
69 |
| - // adapter, |
70 |
| - providers: [ |
71 |
| - // E-mail |
72 |
| - // Start fake e-mail server with `npm run start:email` |
73 |
| - // EmailProvider({ |
74 |
| - // server: { |
75 |
| - // host: "127.0.0.1", |
76 |
| - // auth: null, |
77 |
| - // secure: false, |
78 |
| - // port: 1025, |
79 |
| - // tls: { rejectUnauthorized: false }, |
80 |
| - // }, |
81 |
| - // }), |
82 |
| - // Credentials |
83 |
| - CredentialsProvider({ |
84 |
| - name: "Credentials", |
85 |
| - credentials: { |
86 |
| - password: { label: "Password", type: "password" }, |
87 |
| - }, |
88 |
| - async authorize(credentials) { |
89 |
| - if (credentials.password === "pw") { |
90 |
| - return { |
91 |
| - name: "Fill Murray", |
92 |
| - email: "bill@fillmurray.com", |
93 |
| - image: "https://www.fillmurray.com/64/64", |
94 |
| - } |
95 |
| - } |
96 |
| - return null |
97 |
| - }, |
98 |
| - }), |
99 |
| - // OAuth 1 |
100 |
| - // TwitterLegacyProvider({ |
101 |
| - // clientId: process.env.TWITTER_LEGACY_ID, |
102 |
| - // clientSecret: process.env.TWITTER_LEGACY_SECRET, |
103 |
| - // }), |
104 |
| - // OAuth 2 / OIDC |
105 |
| - TwitterProvider({ |
106 |
| - // Opt-in to the new Twitter API for now. Should be default in the future. |
107 |
| - version: "2.0", |
108 |
| - clientId: process.env.TWITTER_ID, |
109 |
| - clientSecret: process.env.TWITTER_SECRET, |
110 |
| - }), |
111 |
| - GitHubProvider({ |
112 |
| - clientId: process.env.GITHUB_ID, |
113 |
| - clientSecret: process.env.GITHUB_SECRET, |
114 |
| - }), |
115 |
| - Auth0Provider({ |
116 |
| - clientId: process.env.AUTH0_ID, |
117 |
| - clientSecret: process.env.AUTH0_SECRET, |
118 |
| - issuer: process.env.AUTH0_ISSUER, |
119 |
| - }), |
120 |
| - KeycloakProvider({ |
121 |
| - clientId: process.env.KEYCLOAK_ID, |
122 |
| - clientSecret: process.env.KEYCLOAK_SECRET, |
123 |
| - issuer: process.env.KEYCLOAK_ISSUER, |
124 |
| - }), |
125 |
| - Twitch({ |
126 |
| - clientId: process.env.TWITCH_ID, |
127 |
| - clientSecret: process.env.TWITCH_SECRET, |
128 |
| - }), |
129 |
| - GoogleProvider({ |
130 |
| - clientId: process.env.GOOGLE_ID, |
131 |
| - clientSecret: process.env.GOOGLE_SECRET, |
132 |
| - }), |
133 |
| - FacebookProvider({ |
134 |
| - clientId: process.env.FACEBOOK_ID, |
135 |
| - clientSecret: process.env.FACEBOOK_SECRET, |
136 |
| - }), |
137 |
| - FoursquareProvider({ |
138 |
| - clientId: process.env.FOURSQUARE_ID, |
139 |
| - clientSecret: process.env.FOURSQUARE_SECRET, |
140 |
| - }), |
141 |
| - // FreshbooksProvider({ |
142 |
| - // clientId: process.env.FRESHBOOKS_ID, |
143 |
| - // clientSecret: process.env.FRESHBOOKS_SECRET, |
144 |
| - // }), |
145 |
| - GitlabProvider({ |
146 |
| - clientId: process.env.GITLAB_ID, |
147 |
| - clientSecret: process.env.GITLAB_SECRET, |
148 |
| - }), |
149 |
| - InstagramProvider({ |
150 |
| - clientId: process.env.INSTAGRAM_ID, |
151 |
| - clientSecret: process.env.INSTAGRAM_SECRET, |
152 |
| - }), |
153 |
| - LineProvider({ |
154 |
| - clientId: process.env.LINE_ID, |
155 |
| - clientSecret: process.env.LINE_SECRET, |
156 |
| - }), |
157 |
| - LinkedInProvider({ |
158 |
| - clientId: process.env.LINKEDIN_ID, |
159 |
| - clientSecret: process.env.LINKEDIN_SECRET, |
160 |
| - }), |
161 |
| - MailchimpProvider({ |
162 |
| - clientId: process.env.MAILCHIMP_ID, |
163 |
| - clientSecret: process.env.MAILCHIMP_SECRET, |
164 |
| - }), |
165 |
| - IDS4Provider({ |
166 |
| - clientId: process.env.IDS4_ID, |
167 |
| - clientSecret: process.env.IDS4_SECRET, |
168 |
| - issuer: process.env.IDS4_ISSUER, |
169 |
| - }), |
170 |
| - DuendeIDS6Provider({ |
171 |
| - clientId: "interactive.confidential", |
172 |
| - clientSecret: "secret", |
173 |
| - issuer: "https://demo.duendesoftware.com", |
174 |
| - }), |
175 |
| - DiscordProvider({ |
176 |
| - clientId: process.env.DISCORD_ID, |
177 |
| - clientSecret: process.env.DISCORD_SECRET, |
178 |
| - }), |
179 |
| - AzureADProvider({ |
180 |
| - clientId: process.env.AZURE_AD_CLIENT_ID, |
181 |
| - clientSecret: process.env.AZURE_AD_CLIENT_SECRET, |
182 |
| - tenantId: process.env.AZURE_AD_TENANT_ID, |
183 |
| - profilePhotoSize: 48, |
184 |
| - }), |
185 |
| - SpotifyProvider({ |
186 |
| - clientId: process.env.SPOTIFY_ID, |
187 |
| - clientSecret: process.env.SPOTIFY_SECRET, |
188 |
| - }), |
189 |
| - CognitoProvider({ |
190 |
| - clientId: process.env.COGNITO_ID, |
191 |
| - clientSecret: process.env.COGNITO_SECRET, |
192 |
| - issuer: process.env.COGNITO_ISSUER, |
193 |
| - }), |
194 |
| - Okta({ |
195 |
| - clientId: process.env.OKTA_ID, |
196 |
| - clientSecret: process.env.OKTA_SECRET, |
197 |
| - issuer: process.env.OKTA_ISSUER, |
198 |
| - }), |
199 |
| - SlackProvider({ |
200 |
| - clientId: process.env.SLACK_ID, |
201 |
| - clientSecret: process.env.SLACK_SECRET, |
202 |
| - }), |
203 |
| - AzureB2C({ |
204 |
| - clientId: process.env.AZURE_B2C_ID, |
205 |
| - clientSecret: process.env.AZURE_B2C_SECRET, |
206 |
| - tenantId: process.env.AZURE_B2C_TENANT_ID, |
207 |
| - primaryUserFlow: process.env.AZURE_B2C_PRIMARY_USER_FLOW, |
208 |
| - }), |
209 |
| - OsuProvider({ |
210 |
| - clientId: process.env.OSU_CLIENT_ID, |
211 |
| - clientSecret: process.env.OSU_CLIENT_SECRET, |
212 |
| - }), |
213 |
| - AppleProvider({ |
214 |
| - clientId: process.env.APPLE_ID, |
215 |
| - clientSecret: process.env.APPLE_SECRET, |
216 |
| - }), |
217 |
| - PatreonProvider({ |
218 |
| - clientId: process.env.PATREON_ID, |
219 |
| - clientSecret: process.env.PATREON_SECRET, |
220 |
| - }), |
221 |
| - TraktProvider({ |
222 |
| - clientId: process.env.TRAKT_ID, |
223 |
| - clientSecret: process.env.TRAKT_SECRET, |
224 |
| - }), |
225 |
| - WorkOSProvider({ |
226 |
| - clientId: process.env.WORKOS_ID, |
227 |
| - clientSecret: process.env.WORKOS_SECRET, |
228 |
| - }), |
229 |
| - BoxyHQSAMLProvider({ |
230 |
| - issuer: process.env.BOXYHQSAML_ISSUER ?? "https://example.com", |
231 |
| - clientId: process.env.BOXYHQSAML_ID, |
232 |
| - clientSecret: process.env.BOXYHQSAML_SECRET, |
233 |
| - }), |
234 |
| - WikimediaProvider({ |
235 |
| - clientId: process.env.WIKIMEDIA_ID, |
236 |
| - clientSecret: process.env.WIKIMEDIA_SECRET, |
237 |
| - }), |
238 |
| - VkProvider({ |
239 |
| - clientId: process.env.VK_ID, |
240 |
| - clientSecret: process.env.VK_SECRET |
241 |
| - }), |
242 |
| - ], |
| 77 | + adapter: adapters.noop(), |
243 | 78 | debug: true,
|
244 | 79 | theme: {
|
245 |
| - colorScheme: "auto", |
246 | 80 | logo: "https://next-auth.js.org/img/logo/logo-sm.png",
|
247 | 81 | brandColor: "#1786fb",
|
248 | 82 | },
|
| 83 | + providers: [ |
| 84 | + Credentials({ |
| 85 | + credentials: { password: { label: "Password", type: "password" } }, |
| 86 | + async authorize(credentials) { |
| 87 | + if (credentials.password !== "pw") return null |
| 88 | + return { name: "Fill Murray", email: "bill@fillmurray.com", image: "https://www.fillmurray.com/64/64" } |
| 89 | + }, |
| 90 | + }), |
| 91 | + Apple({ clientId: process.env.APPLE_ID, clientSecret: process.env.APPLE_SECRET }), |
| 92 | + Auth0({ clientId: process.env.AUTH0_ID, clientSecret: process.env.AUTH0_SECRET, issuer: process.env.AUTH0_ISSUER }), |
| 93 | + AzureAD({ clientId: process.env.AZURE_AD_CLIENT_ID, clientSecret: process.env.AZURE_AD_CLIENT_SECRET, tenantId: process.env.AZURE_AD_TENANT_ID }), |
| 94 | + AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }), |
| 95 | + BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }), |
| 96 | + Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }), |
| 97 | + Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }), |
| 98 | + DuendeIDS6({ clientId: "interactive.confidential", clientSecret: "secret", issuer: "https://demo.duendesoftware.com" }), |
| 99 | + Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }), |
| 100 | + Foursquare({ clientId: process.env.FOURSQUARE_ID, clientSecret: process.env.FOURSQUARE_SECRET }), |
| 101 | + Freshbooks({ clientId: process.env.FRESHBOOKS_ID, clientSecret: process.env.FRESHBOOKS_SECRET }), |
| 102 | + GitHub({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET }), |
| 103 | + Gitlab({ clientId: process.env.GITLAB_ID, clientSecret: process.env.GITLAB_SECRET }), |
| 104 | + Google({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET }), |
| 105 | + IDS4({ clientId: process.env.IDS4_ID, clientSecret: process.env.IDS4_SECRET, issuer: process.env.IDS4_ISSUER }), |
| 106 | + Instagram({ clientId: process.env.INSTAGRAM_ID, clientSecret: process.env.INSTAGRAM_SECRET }), |
| 107 | + Keycloak({ clientId: process.env.KEYCLOAK_ID, clientSecret: process.env.KEYCLOAK_SECRET, issuer: process.env.KEYCLOAK_ISSUER }), |
| 108 | + Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }), |
| 109 | + LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }), |
| 110 | + Mailchimp({ clientId: process.env.MAILCHIMP_ID, clientSecret: process.env.MAILCHIMP_SECRET }), |
| 111 | + Okta({ clientId: process.env.OKTA_ID, clientSecret: process.env.OKTA_SECRET, issuer: process.env.OKTA_ISSUER }), |
| 112 | + Osu({ clientId: process.env.OSU_CLIENT_ID, clientSecret: process.env.OSU_CLIENT_SECRET }), |
| 113 | + Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }), |
| 114 | + Slack({ clientId: process.env.SLACK_ID, clientSecret: process.env.SLACK_SECRET }), |
| 115 | + Spotify({ clientId: process.env.SPOTIFY_ID, clientSecret: process.env.SPOTIFY_SECRET }), |
| 116 | + Trakt({ clientId: process.env.TRAKT_ID, clientSecret: process.env.TRAKT_SECRET }), |
| 117 | + Twitch({ clientId: process.env.TWITCH_ID, clientSecret: process.env.TWITCH_SECRET }), |
| 118 | + Twitter({ version: "2.0", clientId: process.env.TWITTER_ID, clientSecret: process.env.TWITTER_SECRET }), |
| 119 | + TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }), |
| 120 | + Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }), |
| 121 | + Wikimedia({ clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET }), |
| 122 | + WorkOS({ clientId: process.env.WORKOS_ID, clientSecret: process.env.WORKOS_SECRET }), |
| 123 | + ], |
| 124 | +} |
| 125 | + |
| 126 | +if (authOptions.adapter) { |
| 127 | + authOptions.providers.unshift( |
| 128 | + // NOTE: You can start a fake e-mail server with `pnpm email` |
| 129 | + // and then go to `http://localhost:1080` in the browser |
| 130 | + Email({ |
| 131 | + server: { |
| 132 | + host: "127.0.0.1", |
| 133 | + auth: null, |
| 134 | + secure: false, |
| 135 | + port: 1025, |
| 136 | + tls: { rejectUnauthorized: false }, |
| 137 | + }, |
| 138 | + }) |
| 139 | + ) |
249 | 140 | }
|
250 | 141 |
|
251 | 142 | export default NextAuth(authOptions)
|
0 commit comments