Skip to content

Commit 82e107c

Browse files
committed
chore: improve dev app DX
1 parent f705034 commit 82e107c

File tree

3 files changed

+139
-243
lines changed

3 files changed

+139
-243
lines changed

apps/dev/.env.local.example

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,5 @@ EMAIL_FROM=user@gmail.com
4747
# MongoDB: DATABASE_URL=mongodb://nextauth:password@127.0.0.1:27017/nextauth?synchronize=true
4848
DATABASE_URL=
4949

50-
BOXYHQSAML_ISSUER="https://jackson-demo.boxyhq.com"
51-
BOXYHQSAML_ID="tenant=boxyhq.com&product=saml-demo.boxyhq.com"
52-
BOXYHQSAML_SECRET="dummy"
53-
5450
WIKIMEDIA_ID=
5551
WIKIMEDIA_SECRET=
Lines changed: 129 additions & 238 deletions
Original file line numberDiff line numberDiff line change
@@ -1,251 +1,142 @@
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"
463

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"
5238

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"
6145

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+
}
6775

6876
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(),
24378
debug: true,
24479
theme: {
245-
colorScheme: "auto",
24680
logo: "https://next-auth.js.org/img/logo/logo-sm.png",
24781
brandColor: "#1786fb",
24882
},
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+
)
249140
}
250141

251142
export default NextAuth(authOptions)

0 commit comments

Comments
 (0)