mirror of
https://github.com/SrIzan10/next-auth.git
synced 2026-05-01 10:55:20 +00:00
Compare commits
8 Commits
@auth/core
...
@auth/sequ
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4f3241f8dd | ||
|
|
65043ba471 | ||
|
|
46c5a97a0e | ||
|
|
9f99066b19 | ||
|
|
e266001c28 | ||
|
|
f1eb45f3c1 | ||
|
|
f621627914 | ||
|
|
2b6ad02bba |
5
apps/examples/nextjs/app/api/auth/[...nextauth]/route.ts
Normal file
5
apps/examples/nextjs/app/api/auth/[...nextauth]/route.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import NextAuth from "next-auth/next"
|
||||||
|
import { config } from "auth"
|
||||||
|
|
||||||
|
const handler = NextAuth(config)
|
||||||
|
export { handler as GET, handler as POST }
|
||||||
294
apps/examples/nextjs/auth.ts
Normal file
294
apps/examples/nextjs/auth.ts
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
import type { GetServerSidePropsContext, NextApiRequest, NextApiResponse } from "next"
|
||||||
|
import type { NextAuthOptions as NextAuthConfig } from "next-auth"
|
||||||
|
import { getServerSession } from "next-auth"
|
||||||
|
|
||||||
|
import Apple from "next-auth/providers/apple"
|
||||||
|
import Atlassian from "next-auth/providers/atlassian"
|
||||||
|
import Auth0 from "next-auth/providers/auth0"
|
||||||
|
import Authentik from "next-auth/providers/authentik"
|
||||||
|
import AzureAD from "next-auth/providers/azure-ad"
|
||||||
|
import AzureB2C from "next-auth/providers/azure-ad-b2c"
|
||||||
|
import Battlenet from "next-auth/providers/battlenet"
|
||||||
|
import Box from "next-auth/providers/box"
|
||||||
|
import BoxyHQSAML from "next-auth/providers/boxyhq-saml"
|
||||||
|
import Bungie from "next-auth/providers/bungie"
|
||||||
|
import Cognito from "next-auth/providers/cognito"
|
||||||
|
import Coinbase from "next-auth/providers/coinbase"
|
||||||
|
import Discord from "next-auth/providers/discord"
|
||||||
|
import Dropbox from "next-auth/providers/dropbox"
|
||||||
|
import DuendeIDS6 from "next-auth/providers/duende-identity-server6"
|
||||||
|
import Eveonline from "next-auth/providers/eveonline"
|
||||||
|
import Facebook from "next-auth/providers/facebook"
|
||||||
|
import Faceit from "next-auth/providers/faceit"
|
||||||
|
import FortyTwoSchool from "next-auth/providers/42-school"
|
||||||
|
import Foursquare from "next-auth/providers/foursquare"
|
||||||
|
import Freshbooks from "next-auth/providers/freshbooks"
|
||||||
|
import Fusionauth from "next-auth/providers/fusionauth"
|
||||||
|
import GitHub from "next-auth/providers/github"
|
||||||
|
import Gitlab from "next-auth/providers/gitlab"
|
||||||
|
import Google from "next-auth/providers/google"
|
||||||
|
import Hubspot from "next-auth/providers/hubspot"
|
||||||
|
import Instagram from "next-auth/providers/instagram"
|
||||||
|
import Kakao from "next-auth/providers/kakao"
|
||||||
|
import Keycloak from "next-auth/providers/keycloak"
|
||||||
|
import Line from "next-auth/providers/line"
|
||||||
|
import LinkedIn from "next-auth/providers/linkedin"
|
||||||
|
import Mailchimp from "next-auth/providers/mailchimp"
|
||||||
|
import Mailru from "next-auth/providers/mailru"
|
||||||
|
import Medium from "next-auth/providers/medium"
|
||||||
|
import Naver from "next-auth/providers/naver"
|
||||||
|
import Netlify from "next-auth/providers/netlify"
|
||||||
|
import Okta from "next-auth/providers/okta"
|
||||||
|
import Onelogin from "next-auth/providers/onelogin"
|
||||||
|
import Osso from "next-auth/providers/osso"
|
||||||
|
import Osu from "next-auth/providers/osu"
|
||||||
|
import Passage from "next-auth/providers/passage"
|
||||||
|
import Patreon from "next-auth/providers/patreon"
|
||||||
|
import Pinterest from "next-auth/providers/pinterest"
|
||||||
|
import Pipedrive from "next-auth/providers/pipedrive"
|
||||||
|
import Reddit from "next-auth/providers/reddit"
|
||||||
|
import Salesforce from "next-auth/providers/salesforce"
|
||||||
|
import Slack from "next-auth/providers/slack"
|
||||||
|
import Spotify from "next-auth/providers/spotify"
|
||||||
|
import Strava from "next-auth/providers/strava"
|
||||||
|
import Todoist from "next-auth/providers/todoist"
|
||||||
|
import Trakt from "next-auth/providers/trakt"
|
||||||
|
import Twitch from "next-auth/providers/twitch"
|
||||||
|
import Twitter from "next-auth/providers/twitter"
|
||||||
|
import UnitedEffects from "next-auth/providers/united-effects"
|
||||||
|
import Vk from "next-auth/providers/vk"
|
||||||
|
import Wikimedia from "next-auth/providers/wikimedia"
|
||||||
|
import Wordpress from "next-auth/providers/wordpress"
|
||||||
|
import WorkOS from "next-auth/providers/workos"
|
||||||
|
import Yandex from "next-auth/providers/yandex"
|
||||||
|
import Zitadel from "next-auth/providers/zitadel"
|
||||||
|
import Zoho from "next-auth/providers/zoho"
|
||||||
|
import Zoom from "next-auth/providers/zoom"
|
||||||
|
|
||||||
|
// Read more at: https://next-auth.js.org/getting-started/typescript#module-augmentation
|
||||||
|
declare module "next-auth/jwt" {
|
||||||
|
interface JWT {
|
||||||
|
/** The user's role. */
|
||||||
|
userRole?: "admin"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
// https://next-auth.js.org/configuration/providers/oauth
|
||||||
|
providers: [
|
||||||
|
Apple({ clientId: process.env.AUTH_APPLE_ID, clientSecret: process.env.AUTH_APPLE_SECRET }),
|
||||||
|
Atlassian({ clientId: process.env.AUTH_ATLASSIAN_ID, clientSecret: process.env.AUTH_ATLASSIAN_SECRET }),
|
||||||
|
Auth0({ clientId: process.env.AUTH_AUTH0_ID, clientSecret: process.env.AUTH_AUTH0_SECRET, issuer: process.env.AUTH_AUTH0_ISSUER }),
|
||||||
|
Authentik({ clientId: process.env.AUTH_AUTHENTIK_ID, clientSecret: process.env.AUTH_AUTHENTIK_SECRET }),
|
||||||
|
AzureAD({ clientId: process.env.AUTH_AZUREAD_ID, clientSecret: process.env.AUTH_AZUREAD_SECRET }),
|
||||||
|
AzureB2C({ clientId: process.env.AUTH_AZUREB2C_ID, clientSecret: process.env.AUTH_AZUREB2C_SECRET }),
|
||||||
|
Battlenet({ clientId: process.env.AUTH_BN_ID, clientSecret: process.env.AUTH_BN_SECRET, issuer: process.env.AUTH_BN_ISSUER }),
|
||||||
|
Box({ clientId: process.env.AUTH_BOX_ID, clientSecret: process.env.AUTH_BOX_SECRET }),
|
||||||
|
BoxyHQSAML({ clientId: process.env.AUTH_BOXYHQ_ID, clientSecret: process.env.AUTH_BOXYHQ_SECRET, issuer: process.env.AUTH_BOXYHQ_ISSUER }),
|
||||||
|
Bungie({ clientId: process.env.AUTH_BUNGIE_ID, clientSecret: process.env.AUTH_BUNGIE_SECRET }),
|
||||||
|
Cognito({ clientId: process.env.AUTH_COGNITO_ID, clientSecret: process.env.AUTH_COGNITO_SECRET }),
|
||||||
|
Coinbase({ clientId: process.env.AUTH_COINBASE_ID, clientSecret: process.env.AUTH_COINBASE_SECRET }),
|
||||||
|
Discord({ clientId: process.env.AUTH_DISCORD_ID, clientSecret: process.env.AUTH_DISCORD_SECRET }),
|
||||||
|
Dropbox({ clientId: process.env.AUTH_DROPBOX_ID, clientSecret: process.env.AUTH_DROPBOX_SECRET }),
|
||||||
|
DuendeIDS6({ clientId: process.env.AUTH_DUENDEIDS6_ID, clientSecret: process.env.AUTH_DUENDEIDS6_SECRET }),
|
||||||
|
Eveonline({ clientId: process.env.AUTH_EVEONLINE_ID, clientSecret: process.env.AUTH_EVEONLINE_SECRET }),
|
||||||
|
Facebook({ clientId: process.env.AUTH_FACEBOOK_ID, clientSecret: process.env.AUTH_FACEBOOK_SECRET }),
|
||||||
|
Faceit({ clientId: process.env.AUTH_FACEIT_ID, clientSecret: process.env.AUTH_FACEIT_SECRET }),
|
||||||
|
FortyTwoSchool({ clientId: process.env.AUTH_FORTYTWOSCHOOL_ID, clientSecret: process.env.AUTH_FORTYTWOSCHOOL_SECRET }),
|
||||||
|
Foursquare({ clientId: process.env.AUTH_FOURSQUARE_ID, clientSecret: process.env.AUTH_FOURSQUARE_SECRET }),
|
||||||
|
Freshbooks({ clientId: process.env.AUTH_FRESHBOOKS_ID, clientSecret: process.env.AUTH_FRESHBOOKS_SECRET }),
|
||||||
|
Fusionauth({ clientId: process.env.AUTH_FUSIONAUTH_ID, clientSecret: process.env.AUTH_FUSIONAUTH_SECRET }),
|
||||||
|
GitHub({ clientId: process.env.AUTH_GITHUB_ID, clientSecret: process.env.AUTH_GITHUB_SECRET }),
|
||||||
|
Gitlab({ clientId: process.env.AUTH_GITLAB_ID, clientSecret: process.env.AUTH_GITLAB_SECRET }),
|
||||||
|
Google({ clientId: process.env.AUTH_GOOGLE_ID, clientSecret: process.env.AUTH_GOOGLE_SECRET }),
|
||||||
|
Hubspot({ clientId: process.env.AUTH_HUBSPOT_ID, clientSecret: process.env.AUTH_HUBSPOT_SECRET }),
|
||||||
|
Instagram({ clientId: process.env.AUTH_INSTAGRAM_ID, clientSecret: process.env.AUTH_INSTAGRAM_SECRET }),
|
||||||
|
Kakao({ clientId: process.env.AUTH_KAKAO_ID, clientSecret: process.env.AUTH_KAKAO_SECRET }),
|
||||||
|
Keycloak({ clientId: process.env.AUTH_KEYCLOAK_ID, clientSecret: process.env.AUTH_KEYCLOAK_SECRET }),
|
||||||
|
Line({ clientId: process.env.AUTH_LINE_ID, clientSecret: process.env.AUTH_LINE_SECRET }),
|
||||||
|
LinkedIn({ clientId: process.env.AUTH_LINKEDIN_ID, clientSecret: process.env.AUTH_LINKEDIN_SECRET }),
|
||||||
|
Mailchimp({ clientId: process.env.AUTH_MAILCHIMP_ID, clientSecret: process.env.AUTH_MAILCHIMP_SECRET }),
|
||||||
|
Mailru({ clientId: process.env.AUTH_MAILRU_ID, clientSecret: process.env.AUTH_MAILRU_SECRET }),
|
||||||
|
Medium({ clientId: process.env.AUTH_MEDIUM_ID, clientSecret: process.env.AUTH_MEDIUM_SECRET }),
|
||||||
|
Naver({ clientId: process.env.AUTH_NAVER_ID, clientSecret: process.env.AUTH_NAVER_SECRET }),
|
||||||
|
Netlify({ clientId: process.env.AUTH_NETLIFY_ID, clientSecret: process.env.AUTH_NETLIFY_SECRET }),
|
||||||
|
Okta({ clientId: process.env.AUTH_OKTA_ID, clientSecret: process.env.AUTH_OKTA_SECRET }),
|
||||||
|
Onelogin({ clientId: process.env.AUTH_ONELOGIN_ID, clientSecret: process.env.AUTH_ONELOGIN_SECRET }),
|
||||||
|
Osso({ clientId: process.env.AUTH_OSSO_ID, clientSecret: process.env.AUTH_OSSO_SECRET, issuer: process.env.AUTH_OSSO_ISSUER }),
|
||||||
|
Osu({ clientId: process.env.AUTH_OSU_ID, clientSecret: process.env.AUTH_OSU_SECRET }),
|
||||||
|
Passage({ clientId: process.env.AUTH_PASSAGE_ID, clientSecret: process.env.AUTH_PASSAGE_SECRET, issuer: process.env.AUTH_PASSAGE_ISSUER }),
|
||||||
|
Patreon({ clientId: process.env.AUTH_PATREON_ID, clientSecret: process.env.AUTH_PATREON_SECRET }),
|
||||||
|
Pinterest({ clientId: process.env.AUTH_PINTEREST_ID, clientSecret: process.env.AUTH_PINTEREST_SECRET }),
|
||||||
|
Pipedrive({ clientId: process.env.AUTH_PIPEDRIVE_ID, clientSecret: process.env.AUTH_PIPEDRIVE_SECRET }),
|
||||||
|
Reddit({ clientId: process.env.AUTH_REDDIT_ID, clientSecret: process.env.AUTH_REDDIT_SECRET }),
|
||||||
|
Salesforce({ clientId: process.env.AUTH_SALESFORCE_ID, clientSecret: process.env.AUTH_SALESFORCE_SECRET }),
|
||||||
|
Slack({ clientId: process.env.AUTH_SLACK_ID, clientSecret: process.env.AUTH_SLACK_SECRET }),
|
||||||
|
Spotify({ clientId: process.env.AUTH_SPOTIFY_ID, clientSecret: process.env.AUTH_SPOTIFY_SECRET }),
|
||||||
|
Strava({ clientId: process.env.AUTH_STRAVA_ID, clientSecret: process.env.AUTH_STRAVA_SECRET }),
|
||||||
|
Todoist({ clientId: process.env.AUTH_TODOIST_ID, clientSecret: process.env.AUTH_TODOIST_SECRET }),
|
||||||
|
Trakt({ clientId: process.env.AUTH_TRAKT_ID, clientSecret: process.env.AUTH_TRAKT_SECRET }),
|
||||||
|
Twitch({ clientId: process.env.AUTH_TWITCH_ID, clientSecret: process.env.AUTH_TWITCH_SECRET }),
|
||||||
|
Twitter({ clientId: process.env.AUTH_TWITTER_ID, clientSecret: process.env.AUTH_TWITTER_SECRET, version: "2.0" }),
|
||||||
|
UnitedEffects({ clientId: process.env.AUTH_UE_ID, clientSecret: process.env.AUTH_UE_SECRET, issuer: process.env.AUTH_UE_ISSUER }),
|
||||||
|
Vk({ clientId: process.env.AUTH_VK_ID, clientSecret: process.env.AUTH_VK_SECRET }),
|
||||||
|
Wikimedia({ clientId: process.env.AUTH_WIKIMEDIA_ID, clientSecret: process.env.AUTH_WIKIMEDIA_SECRET }),
|
||||||
|
Wordpress({ clientId: process.env.AUTH_WORDPRESS_ID, clientSecret: process.env.AUTH_WORDPRESS_SECRET }),
|
||||||
|
WorkOS({ clientId: process.env.AUTH_WORKOS_ID, clientSecret: process.env.AUTH_WORKOS_SECRET }),
|
||||||
|
Yandex({ clientId: process.env.AUTH_YANDEX_ID, clientSecret: process.env.AUTH_YANDEX_SECRET }),
|
||||||
|
Zitadel({ clientId: process.env.AUTH_ZITADEL_ID, clientSecret: process.env.AUTH_ZITADEL_SECRET }),
|
||||||
|
Zoho({ clientId: process.env.AUTH_ZOHO_ID, clientSecret: process.env.AUTH_ZOHO_SECRET }),
|
||||||
|
Zoom({ clientId: process.env.AUTH_ZOOM_ID, clientSecret: process.env.AUTH_ZOOM_SECRET }),
|
||||||
|
],
|
||||||
|
callbacks: {
|
||||||
|
async jwt({ token }) {
|
||||||
|
token.userRole = "admin"
|
||||||
|
return token
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} satisfies NextAuthConfig
|
||||||
|
|
||||||
|
// Helper function to get session without passing config every time
|
||||||
|
// https://next-auth.js.org/configuration/nextjs#getserversession
|
||||||
|
export function auth(...args: [GetServerSidePropsContext["req"], GetServerSidePropsContext["res"]] | [NextApiRequest, NextApiResponse] | []) {
|
||||||
|
return getServerSession(...args, config)
|
||||||
|
}
|
||||||
|
|
||||||
|
// We recommend doing your own environment variable validation
|
||||||
|
declare global {
|
||||||
|
namespace NodeJS {
|
||||||
|
export interface ProcessEnv {
|
||||||
|
NEXTAUTH_SECRET: string
|
||||||
|
|
||||||
|
AUTH_APPLE_ID: string
|
||||||
|
AUTH_APPLE_SECRET: string
|
||||||
|
AUTH_ATLASSIAN_ID: string
|
||||||
|
AUTH_ATLASSIAN_SECRET: string
|
||||||
|
AUTH_AUTH0_ID: string
|
||||||
|
AUTH_AUTH0_ISSUER: string
|
||||||
|
AUTH_AUTH0_SECRET: string
|
||||||
|
AUTH_AUTHENTIK_ID: string
|
||||||
|
AUTH_AUTHENTIK_SECRET: string
|
||||||
|
AUTH_AZUREAD_ID: string
|
||||||
|
AUTH_AZUREAD_SECRET: string
|
||||||
|
AUTH_AZUREB2C_ID: string
|
||||||
|
AUTH_AZUREB2C_SECRET: string
|
||||||
|
AUTH_BN_ID: string
|
||||||
|
AUTH_BN_ISSUER: any
|
||||||
|
AUTH_BN_SECRET: string
|
||||||
|
AUTH_BOX_ID: string
|
||||||
|
AUTH_BOX_SECRET: string
|
||||||
|
AUTH_BOXYHQ_ID: string
|
||||||
|
AUTH_BOXYHQ_ISSUER: string
|
||||||
|
AUTH_BOXYHQ_SECRET: string
|
||||||
|
AUTH_BUNGIE_ID: string
|
||||||
|
AUTH_BUNGIE_SECRET: string
|
||||||
|
AUTH_COGNITO_ID: string
|
||||||
|
AUTH_COGNITO_SECRET: string
|
||||||
|
AUTH_COINBASE_ID: string
|
||||||
|
AUTH_COINBASE_SECRET: string
|
||||||
|
AUTH_DISCORD_ID: string
|
||||||
|
AUTH_DISCORD_SECRET: string
|
||||||
|
AUTH_DROPBOX_ID: string
|
||||||
|
AUTH_DROPBOX_SECRET: string
|
||||||
|
AUTH_DUENDEIDS6_ID: string
|
||||||
|
AUTH_DUENDEIDS6_SECRET: string
|
||||||
|
AUTH_EVEONLINE_ID: string
|
||||||
|
AUTH_EVEONLINE_SECRET: string
|
||||||
|
AUTH_FACEBOOK_ID: string
|
||||||
|
AUTH_FACEBOOK_SECRET: string
|
||||||
|
AUTH_FACEIT_ID: string
|
||||||
|
AUTH_FACEIT_SECRET: string
|
||||||
|
AUTH_FORTYTWOSCHOOL_ID: string
|
||||||
|
AUTH_FORTYTWOSCHOOL_SECRET: string
|
||||||
|
AUTH_FOURSQUARE_ID: string
|
||||||
|
AUTH_FOURSQUARE_SECRET: string
|
||||||
|
AUTH_FRESHBOOKS_ID: string
|
||||||
|
AUTH_FRESHBOOKS_SECRET: string
|
||||||
|
AUTH_FUSIONAUTH_ID: string
|
||||||
|
AUTH_FUSIONAUTH_SECRET: string
|
||||||
|
AUTH_GITHUB_ID: string
|
||||||
|
AUTH_GITHUB_SECRET: string
|
||||||
|
AUTH_GITLAB_ID: string
|
||||||
|
AUTH_GITLAB_SECRET: string
|
||||||
|
AUTH_GOOGLE_ID: string
|
||||||
|
AUTH_GOOGLE_SECRET: string
|
||||||
|
AUTH_HUBSPOT_ID: string
|
||||||
|
AUTH_HUBSPOT_SECRET: string
|
||||||
|
AUTH_INSTAGRAM_ID: string
|
||||||
|
AUTH_INSTAGRAM_SECRET: string
|
||||||
|
AUTH_KAKAO_ID: string
|
||||||
|
AUTH_KAKAO_SECRET: string
|
||||||
|
AUTH_KEYCLOAK_ID: string
|
||||||
|
AUTH_KEYCLOAK_SECRET: string
|
||||||
|
AUTH_LINE_ID: string
|
||||||
|
AUTH_LINE_SECRET: string
|
||||||
|
AUTH_LINKEDIN_ID: string
|
||||||
|
AUTH_LINKEDIN_SECRET: string
|
||||||
|
AUTH_MAILCHIMP_ID: string
|
||||||
|
AUTH_MAILCHIMP_SECRET: string
|
||||||
|
AUTH_MAILRU_ID: string
|
||||||
|
AUTH_MAILRU_SECRET: string
|
||||||
|
AUTH_MEDIUM_ID: string
|
||||||
|
AUTH_MEDIUM_SECRET: string
|
||||||
|
AUTH_NAVER_ID: string
|
||||||
|
AUTH_NAVER_SECRET: string
|
||||||
|
AUTH_NETLIFY_ID: string
|
||||||
|
AUTH_NETLIFY_SECRET: string
|
||||||
|
AUTH_OKTA_ID: string
|
||||||
|
AUTH_OKTA_SECRET: string
|
||||||
|
AUTH_ONELOGIN_ID: string
|
||||||
|
AUTH_ONELOGIN_SECRET: string
|
||||||
|
AUTH_OSSO_ID: string
|
||||||
|
AUTH_OSSO_ISSUER: string
|
||||||
|
AUTH_OSSO_SECRET: string
|
||||||
|
AUTH_OSU_ID: string
|
||||||
|
AUTH_OSU_SECRET: string
|
||||||
|
AUTH_PASSAGE_ID: string
|
||||||
|
AUTH_PASSAGE_ISSUER: string
|
||||||
|
AUTH_PASSAGE_SECRET: string
|
||||||
|
AUTH_PATREON_ID: string
|
||||||
|
AUTH_PATREON_SECRET: string
|
||||||
|
AUTH_PINTEREST_ID: string
|
||||||
|
AUTH_PINTEREST_SECRET: string
|
||||||
|
AUTH_PIPEDRIVE_ID: string
|
||||||
|
AUTH_PIPEDRIVE_SECRET: string
|
||||||
|
AUTH_REDDIT_ID: string
|
||||||
|
AUTH_REDDIT_SECRET: string
|
||||||
|
AUTH_SALESFORCE_ID: string
|
||||||
|
AUTH_SALESFORCE_SECRET: string
|
||||||
|
AUTH_SLACK_ID: string
|
||||||
|
AUTH_SLACK_SECRET: string
|
||||||
|
AUTH_SPOTIFY_ID: string
|
||||||
|
AUTH_SPOTIFY_SECRET: string
|
||||||
|
AUTH_STRAVA_ID: string
|
||||||
|
AUTH_STRAVA_SECRET: string
|
||||||
|
AUTH_TODOIST_ID: string
|
||||||
|
AUTH_TODOIST_SECRET: string
|
||||||
|
AUTH_TRAKT_ID: string
|
||||||
|
AUTH_TRAKT_SECRET: string
|
||||||
|
AUTH_TWITCH_ID: string
|
||||||
|
AUTH_TWITCH_SECRET: string
|
||||||
|
AUTH_TWITTER_ID: string
|
||||||
|
AUTH_TWITTER_SECRET: string
|
||||||
|
AUTH_UE_ID: string
|
||||||
|
AUTH_UE_ISSUER: string
|
||||||
|
AUTH_UE_SECRET: string
|
||||||
|
AUTH_VK_ID: string
|
||||||
|
AUTH_VK_SECRET: string
|
||||||
|
AUTH_WIKIMEDIA_ID: string
|
||||||
|
AUTH_WIKIMEDIA_SECRET: string
|
||||||
|
AUTH_WORDPRESS_ID: string
|
||||||
|
AUTH_WORDPRESS_SECRET: string
|
||||||
|
AUTH_WORKOS_ID: string
|
||||||
|
AUTH_WORKOS_SECRET: string
|
||||||
|
AUTH_YANDEX_ID: string
|
||||||
|
AUTH_YANDEX_SECRET: string
|
||||||
|
AUTH_ZITADEL_ID: string
|
||||||
|
AUTH_ZITADEL_SECRET: string
|
||||||
|
AUTH_ZOHO_ID: string
|
||||||
|
AUTH_ZOHO_SECRET: string
|
||||||
|
AUTH_ZOOM_ID: string
|
||||||
|
AUTH_ZOOM_SECRET: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
apps/examples/nextjs/next-auth.d.ts
vendored
10
apps/examples/nextjs/next-auth.d.ts
vendored
@@ -1,10 +0,0 @@
|
|||||||
import "next-auth/jwt"
|
|
||||||
|
|
||||||
// Read more at: https://next-auth.js.org/getting-started/typescript#module-augmentation
|
|
||||||
|
|
||||||
declare module "next-auth/jwt" {
|
|
||||||
interface JWT {
|
|
||||||
/** The user's role. */
|
|
||||||
userRole?: "admin"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import NextAuth, { NextAuthOptions } from "next-auth"
|
|
||||||
import GoogleProvider from "next-auth/providers/google"
|
|
||||||
import FacebookProvider from "next-auth/providers/facebook"
|
|
||||||
import GithubProvider from "next-auth/providers/github"
|
|
||||||
import TwitterProvider from "next-auth/providers/twitter"
|
|
||||||
import Auth0Provider from "next-auth/providers/auth0"
|
|
||||||
|
|
||||||
// For more information on each option (and a full list of options) go to
|
|
||||||
// https://next-auth.js.org/configuration/options
|
|
||||||
export const authOptions: NextAuthOptions = {
|
|
||||||
// https://next-auth.js.org/configuration/providers/oauth
|
|
||||||
providers: [
|
|
||||||
Auth0Provider({
|
|
||||||
clientId: process.env.AUTH0_ID,
|
|
||||||
clientSecret: process.env.AUTH0_SECRET,
|
|
||||||
issuer: process.env.AUTH0_ISSUER,
|
|
||||||
}),
|
|
||||||
FacebookProvider({
|
|
||||||
clientId: process.env.FACEBOOK_ID,
|
|
||||||
clientSecret: process.env.FACEBOOK_SECRET,
|
|
||||||
}),
|
|
||||||
GithubProvider({
|
|
||||||
clientId: process.env.GITHUB_ID,
|
|
||||||
clientSecret: process.env.GITHUB_SECRET,
|
|
||||||
}),
|
|
||||||
GoogleProvider({
|
|
||||||
clientId: process.env.GOOGLE_ID,
|
|
||||||
clientSecret: process.env.GOOGLE_SECRET,
|
|
||||||
}),
|
|
||||||
TwitterProvider({
|
|
||||||
clientId: process.env.TWITTER_ID,
|
|
||||||
clientSecret: process.env.TWITTER_SECRET,
|
|
||||||
version: "2.0",
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
callbacks: {
|
|
||||||
async jwt({ token }) {
|
|
||||||
token.userRole = "admin"
|
|
||||||
return token
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export default NextAuth(authOptions)
|
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
// This is an example of to protect an API route
|
// This is an example of to protect an API route
|
||||||
import { getServerSession } from "next-auth/next"
|
|
||||||
import { authOptions } from "../auth/[...nextauth]"
|
|
||||||
|
|
||||||
|
import { auth } from "auth"
|
||||||
import type { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
|
|
||||||
export default async function handler(
|
export default async function handler(
|
||||||
req: NextApiRequest,
|
req: NextApiRequest,
|
||||||
res: NextApiResponse
|
res: NextApiResponse
|
||||||
) {
|
) {
|
||||||
const session = await getServerSession(req, res, authOptions)
|
const session = await auth(req, res)
|
||||||
|
|
||||||
if (session) {
|
if (session) {
|
||||||
return res.send({
|
return res.send({
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
// This is an example of how to access a session from an API route
|
// This is an example of how to access a session from an API route
|
||||||
import { getServerSession } from "next-auth"
|
|
||||||
import { authOptions } from "../auth/[...nextauth]"
|
|
||||||
|
|
||||||
|
import { auth } from "auth"
|
||||||
import type { NextApiRequest, NextApiResponse } from "next"
|
import type { NextApiRequest, NextApiResponse } from "next"
|
||||||
|
|
||||||
export default async function handler(
|
export default async function handler(
|
||||||
req: NextApiRequest,
|
req: NextApiRequest,
|
||||||
res: NextApiResponse
|
res: NextApiResponse
|
||||||
) {
|
) {
|
||||||
const session = await getServerSession(req, res, authOptions)
|
const session = await auth(req, res)
|
||||||
res.send(JSON.stringify(session, null, 2))
|
res.send(JSON.stringify(session, null, 2))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { getServerSession } from "next-auth/next"
|
import { auth } from "auth"
|
||||||
import { authOptions } from "./api/auth/[...nextauth]"
|
|
||||||
import Layout from "../components/layout"
|
import Layout from "../components/layout"
|
||||||
|
|
||||||
import type { GetServerSidePropsContext } from "next"
|
import type { GetServerSidePropsContext } from "next"
|
||||||
@@ -36,9 +35,5 @@ export default function ServerSidePage() {
|
|||||||
|
|
||||||
// Export the `session` prop to use sessions with Server Side Rendering
|
// Export the `session` prop to use sessions with Server Side Rendering
|
||||||
export async function getServerSideProps(context: GetServerSidePropsContext) {
|
export async function getServerSideProps(context: GetServerSidePropsContext) {
|
||||||
return {
|
return { props: { session: await auth(context.req, context.res) } }
|
||||||
props: {
|
|
||||||
session: await getServerSession(context.req, context.res, authOptions),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
18
apps/examples/nextjs/process.d.ts
vendored
18
apps/examples/nextjs/process.d.ts
vendored
@@ -1,18 +0,0 @@
|
|||||||
declare namespace NodeJS {
|
|
||||||
export interface ProcessEnv {
|
|
||||||
NEXTAUTH_URL: string
|
|
||||||
NEXTAUTH_SECRET: string
|
|
||||||
GITHUB_ID: string
|
|
||||||
GITHUB_SECRET: string
|
|
||||||
FACEBOOK_ID: string
|
|
||||||
FACEBOOK_SECRET: string
|
|
||||||
TWITTER_ID: string
|
|
||||||
TWITTER_SECRET: string
|
|
||||||
GOOGLE_ID: string
|
|
||||||
GOOGLE_SECRET: string
|
|
||||||
AUTH0_ID: string
|
|
||||||
AUTH0_SECRET: string
|
|
||||||
DESCOPE_ID: string
|
|
||||||
DESCOPE_SECRET: string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "es5",
|
"target": "es5",
|
||||||
"lib": ["dom", "dom.iterable", "esnext"],
|
"lib": [
|
||||||
|
"dom",
|
||||||
|
"dom.iterable",
|
||||||
|
"esnext"
|
||||||
|
],
|
||||||
"allowJs": true,
|
"allowJs": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
@@ -13,14 +17,22 @@
|
|||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"jsx": "preserve",
|
"jsx": "preserve",
|
||||||
"incremental": true
|
"incremental": true,
|
||||||
|
"baseUrl": ".",
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"name": "next"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"process.d.ts",
|
"process.d.ts",
|
||||||
"next-env.d.ts",
|
"next-env.d.ts",
|
||||||
"next-auth.d.ts",
|
|
||||||
"**/*.ts",
|
"**/*.ts",
|
||||||
"**/*.tsx"
|
"**/*.tsx",
|
||||||
|
".next/types/**/*.ts"
|
||||||
],
|
],
|
||||||
"exclude": ["node_modules"]
|
"exclude": [
|
||||||
|
"node_modules"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,7 +182,127 @@ export default async function listMovies(req, res) {
|
|||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="sveltekit" label="SvelteKit">
|
<TabItem value="sveltekit" label="SvelteKit">
|
||||||
TODO: SvelteKit
|
|
||||||
|
:::warning
|
||||||
|
`@auth/sveltekit` is currently experimental. The API _will_ change in the future.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
This tutorial assumes you have a SvelteKit application set up. If you don't, you can follow the [SvelteKit tutorial](https://kit.svelte.dev/docs/creating-a-project) to get started.
|
||||||
|
|
||||||
|
### Installing Auth.js
|
||||||
|
|
||||||
|
```bash npm2yarn
|
||||||
|
npm install @auth/core @auth/sveltekit
|
||||||
|
```
|
||||||
|
|
||||||
|
### Create server hook
|
||||||
|
|
||||||
|
Create the following [Server hook](https://kit.svelte.dev/docs/hooks) file. This route contains the necessary configuration for Auth.js, as well as the dynamic route handler:
|
||||||
|
|
||||||
|
```ts title="src/hooks.server.ts"
|
||||||
|
import { SvelteKitAuth } from "@auth/sveltekit"
|
||||||
|
import GitHub from "@auth/core/providers/github"
|
||||||
|
import { GITHUB_ID, GITHUB_SECRET } from "$env/static/private"
|
||||||
|
*
|
||||||
|
export const handle = SvelteKitAuth({
|
||||||
|
providers: [GitHub({ clientId: GITHUB_ID, clientSecret: GITHUB_SECRET })],
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
:::info
|
||||||
|
|
||||||
|
Behind the scenes, this creates all the relevant OAuth API routes within `/api/auth/*` so that auth API requests to:
|
||||||
|
|
||||||
|
- [GET `/api/auth/signin`](https://authjs.dev/reference/rest-api#get--apiauthsignin)
|
||||||
|
- [POST `/api/auth/signin/:provider`](https://authjs.dev/reference/rest-api#post--apiauthsigninprovider)
|
||||||
|
- [GET/POST `/api/auth/callback/:provider`](https://authjs.dev/reference/rest-api#get--post--apiauthcallbackprovider)
|
||||||
|
- [GET `/api/auth/signout`](https://authjs.dev/reference/rest-api#get--apiauthsignout)
|
||||||
|
- [POST `/api/auth/signout`](https://authjs.dev/reference/rest-api#post--apiauthsignout)
|
||||||
|
- [GET `/api/auth/session`](https://authjs.dev/reference/rest-api#get--apiauthsession)
|
||||||
|
- [GET `/api/auth/csrf`](https://authjs.dev/reference/rest-api#get--apiauthcsrf)
|
||||||
|
- [GET `/api/auth/providers`](https://authjs.dev/reference/rest-api#get--apiauthproviders)
|
||||||
|
|
||||||
|
can be handled by Auth.js. In this way, Auth.js stays in charge of the whole application's authentication request/response flow.
|
||||||
|
|
||||||
|
Auth.js is fully customizable - [our guides section](/guides/overview) teaches you how to set it up to handle auth in different ways. All the possible configuration options are [listed here](/reference/configuration/auth-config).
|
||||||
|
:::
|
||||||
|
|
||||||
|
### Adding environment variables
|
||||||
|
|
||||||
|
You may notice we are using environment variables in the code example above. We take the value of `GITHUB_ID` and `GITHUB_SECRET` from the GitHub Developer OAuth Portal. See [Configuring OAuth Provider](/getting-started/oauth-tutorial#2-configuring-oauth-provider) section on how to get those.
|
||||||
|
|
||||||
|
In your project root, create a `.env.local` file and add the `AUTH_SECRET` environment variable:
|
||||||
|
|
||||||
|
```title=".env.local"
|
||||||
|
AUTH_SECRET="This is an example"
|
||||||
|
```
|
||||||
|
|
||||||
|
`AUTH_SECRET` is a random string used by the library to encrypt tokens and email verification hashes, and **it's mandatory to keep things secure**! 🔥 🔐 . You can use:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ openssl rand -base64 32
|
||||||
|
```
|
||||||
|
|
||||||
|
or https://generate-secret.vercel.app/32 to generate a random value for it.
|
||||||
|
|
||||||
|
### Exposing the session via page store
|
||||||
|
|
||||||
|
Auth.js provides us a getSession, function to access the session data and status, to call from the `event.locals` variable. We can now just call it and add it to our `$page` store.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import type { LayoutServerLoad } from './$types';
|
||||||
|
*
|
||||||
|
export const load: LayoutServerLoad = async (event) => {
|
||||||
|
return {
|
||||||
|
session: await event.locals.getSession()
|
||||||
|
};
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### Consuming the session via page store
|
||||||
|
|
||||||
|
You can use the `$page.data.session` variable from anywhere on your page. Learn more about SvelteKit's page store in the [SvelteKit docs](https://learn.svelte.dev/tutorial/page-store).
|
||||||
|
|
||||||
|
```ts title="route/+page.svelte"
|
||||||
|
<script>
|
||||||
|
import { signIn, signOut } from '@auth/sveltekit/client'
|
||||||
|
import { page } from '$app/stores'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if $page.data.session?.user}
|
||||||
|
<p>Signed in as {$page.data.session.user.email}</p>
|
||||||
|
<button on:click={signOut}>Sign out</button>
|
||||||
|
<img src="https://cdn.pixabay.com/photo/2017/08/11/19/36/vw-2632486_1280.png" />
|
||||||
|
{:else}
|
||||||
|
<p>Not signed in.</p>
|
||||||
|
<button on:click={() => signIn('github')}>Sign in</button>
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Protecting API Routes
|
||||||
|
|
||||||
|
To protect your API Routes (blocking unauthorized access to resources), you can use `locals.getSessions()` just like in the layouts file to know whether a session exists or not:
|
||||||
|
|
||||||
|
```ts title="routes/api/movies/+server.ts"
|
||||||
|
import { json, error } from "@sveltejs/kit";
|
||||||
|
import type { RequestEvent } from "./$types";
|
||||||
|
|
||||||
|
export async function GET({ locals }: RequestEvent) {
|
||||||
|
const session = await locals.getSession()
|
||||||
|
if (!session?.user) {
|
||||||
|
throw error(401, "You must sign in to view movies.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return json({
|
||||||
|
movies: [
|
||||||
|
{ title: "Alien vs Predator", id: 1 },
|
||||||
|
{ title: "Reservoir Dogs", id: 2 },
|
||||||
|
]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
```
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="solidstart" label="SolidStart">
|
<TabItem value="solidstart" label="SolidStart">
|
||||||
TODO: SolidStart
|
TODO: SolidStart
|
||||||
@@ -314,7 +434,24 @@ $ npm run next dev
|
|||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="sveltekit" label="SvelteKit">
|
<TabItem value="sveltekit" label="SvelteKit">
|
||||||
TODO SvelteKit
|
|
||||||
|
```ts title="src/hooks.server.ts"
|
||||||
|
import { SvelteKitAuth } from "@auth/sveltekit"
|
||||||
|
import GitHub from "@auth/core/providers/github"
|
||||||
|
import { GITHUB_ID, GITHUB_SECRET } from "$env/static/private"
|
||||||
|
*
|
||||||
|
export const handle = SvelteKitAuth({
|
||||||
|
providers: [GitHub({ clientId: GITHUB_ID, clientSecret: GITHUB_SECRET })],
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
Great! We're now ready to run our application locally. Start the Svelte app by running on your terminal the following command and navigating to [`http://localhost:5173`](http://localhost:5173):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ npm run vite dev
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="solidstart" label="SolidStart">
|
<TabItem value="solidstart" label="SolidStart">
|
||||||
TODO SolidStart
|
TODO SolidStart
|
||||||
|
|||||||
@@ -69,7 +69,18 @@ providers: [
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [callbacks documentation](/reference/configuration/auth-config#callbacks) for more information on how to interact with the token.
|
See the [callbacks documentation](/reference/configuration/auth-config#callbacks) for more information on how to interact with the token. For example, you can add additional information to the token by returning an object from the `jwt()` callback:
|
||||||
|
|
||||||
|
```js
|
||||||
|
callbacks: {
|
||||||
|
async jwt(token, user, account, profile, isNewUser) {
|
||||||
|
if (user) {
|
||||||
|
token.id = user.id
|
||||||
|
}
|
||||||
|
return token
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Example - Web3 / Signin With Ethereum
|
## Example - Web3 / Signin With Ethereum
|
||||||
|
|
||||||
|
|||||||
@@ -249,6 +249,7 @@
|
|||||||
{
|
{
|
||||||
"files": [
|
"files": [
|
||||||
"apps/dev/nextjs/pages/api/auth/[...nextauth].ts",
|
"apps/dev/nextjs/pages/api/auth/[...nextauth].ts",
|
||||||
|
"apps/examples/nextjs/auth.ts",
|
||||||
"docs/{sidebars,docusaurus.config}.js"
|
"docs/{sidebars,docusaurus.config}.js"
|
||||||
],
|
],
|
||||||
"options": {
|
"options": {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
"@auth/adapter-test": "workspace:*",
|
"@auth/adapter-test": "workspace:*",
|
||||||
"@auth/tsconfig": "workspace:*",
|
"@auth/tsconfig": "workspace:*",
|
||||||
"jest": "^27.4.3",
|
"jest": "^27.4.3",
|
||||||
"mongodb": "^5.1.0"
|
"mongodb": "^4.17.0"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"preset": "@auth/adapter-test/jest"
|
"preset": "@auth/adapter-test/jest"
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
"@auth/tsconfig": "workspace:*",
|
"@auth/tsconfig": "workspace:*",
|
||||||
"@prisma/client": "^5.2.0",
|
"@prisma/client": "^5.2.0",
|
||||||
"jest": "^27.4.3",
|
"jest": "^27.4.3",
|
||||||
"mongodb": "^4.4.0",
|
"mongodb": "^4.17.0",
|
||||||
"prisma": "^5.2.0"
|
"prisma": "^5.2.0"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@auth/sequelize-adapter",
|
"name": "@auth/sequelize-adapter",
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"description": "Sequelize adapter for Auth.js",
|
"description": "Sequelize adapter for Auth.js",
|
||||||
"homepage": "https://authjs.dev",
|
"homepage": "https://authjs.dev",
|
||||||
"repository": "https://github.com/nextauthjs/next-auth",
|
"repository": "https://github.com/nextauthjs/next-auth",
|
||||||
@@ -51,4 +51,4 @@
|
|||||||
"jest": {
|
"jest": {
|
||||||
"preset": "@auth/adapter-test/jest"
|
"preset": "@auth/adapter-test/jest"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -301,7 +301,9 @@ export default function SequelizeAdapter(
|
|||||||
async deleteSession(sessionToken) {
|
async deleteSession(sessionToken) {
|
||||||
await sync()
|
await sync()
|
||||||
|
|
||||||
|
const session = await Session.findOne({ where: { sessionToken } })
|
||||||
await Session.destroy({ where: { sessionToken } })
|
await Session.destroy({ where: { sessionToken } })
|
||||||
|
return session?.get({ plain: true })
|
||||||
},
|
},
|
||||||
async createVerificationToken(token) {
|
async createVerificationToken(token) {
|
||||||
await sync()
|
await sync()
|
||||||
|
|||||||
@@ -77,6 +77,19 @@ export type CredentialsProviderType = "Credentials"
|
|||||||
* with supporting usernames and passwords.
|
* with supporting usernames and passwords.
|
||||||
*
|
*
|
||||||
* :::
|
* :::
|
||||||
|
*
|
||||||
|
* See the [callbacks documentation](/reference/configuration/auth-config#callbacks) for more information on how to interact with the token. For example, you can add additional information to the token by returning an object from the `jwt()` callback:
|
||||||
|
*
|
||||||
|
* ```js
|
||||||
|
* callbacks: {
|
||||||
|
* async jwt(token, user, account, profile, isNewUser) {
|
||||||
|
* if (user) {
|
||||||
|
* token.id = user.id
|
||||||
|
* }
|
||||||
|
* return token
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
* ```js
|
* ```js
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@auth/sveltekit",
|
"name": "@auth/sveltekit",
|
||||||
"version": "0.3.6",
|
"version": "0.3.7",
|
||||||
"description": "Authentication for SvelteKit.",
|
"description": "Authentication for SvelteKit.",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"authentication",
|
"authentication",
|
||||||
@@ -69,4 +69,4 @@
|
|||||||
},
|
},
|
||||||
"./package.json": "./package.json"
|
"./package.json": "./package.json"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ import type {
|
|||||||
BuiltInProviderType,
|
BuiltInProviderType,
|
||||||
RedirectableProviderType,
|
RedirectableProviderType,
|
||||||
} from "@auth/core/providers"
|
} from "@auth/core/providers"
|
||||||
|
import { base } from "$app/paths";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Client-side method to initiate a signin flow
|
* Client-side method to initiate a signin flow
|
||||||
@@ -34,16 +35,15 @@ export async function signIn<
|
|||||||
const isEmail = providerId === "email"
|
const isEmail = providerId === "email"
|
||||||
const isSupportingReturn = isCredentials || isEmail
|
const isSupportingReturn = isCredentials || isEmail
|
||||||
|
|
||||||
// TODO: Handle custom base path
|
const basePath = base ?? ""
|
||||||
const signInUrl = `/auth/${
|
const signInUrl = `${basePath}/auth/${
|
||||||
isCredentials ? "callback" : "signin"
|
isCredentials ? "callback" : "signin"
|
||||||
}/${providerId}`
|
}/${providerId}`
|
||||||
|
|
||||||
const _signInUrl = `${signInUrl}?${new URLSearchParams(authorizationParams)}`
|
const _signInUrl = `${signInUrl}?${new URLSearchParams(authorizationParams)}`
|
||||||
|
|
||||||
// TODO: Handle custom base path
|
|
||||||
// TODO: Remove this since Sveltekit offers the CSRF protection via origin check
|
// TODO: Remove this since Sveltekit offers the CSRF protection via origin check
|
||||||
const csrfTokenResponse = await fetch("/auth/csrf")
|
const csrfTokenResponse = await fetch(`${basePath}/auth/csrf`)
|
||||||
const { csrfToken } = await csrfTokenResponse.json()
|
const { csrfToken } = await csrfTokenResponse.json()
|
||||||
|
|
||||||
const res = await fetch(_signInUrl, {
|
const res = await fetch(_signInUrl, {
|
||||||
@@ -81,11 +81,11 @@ export async function signIn<
|
|||||||
*/
|
*/
|
||||||
export async function signOut(options?: SignOutParams) {
|
export async function signOut(options?: SignOutParams) {
|
||||||
const { callbackUrl = window.location.href } = options ?? {}
|
const { callbackUrl = window.location.href } = options ?? {}
|
||||||
// TODO: Custom base path
|
const basePath = base ?? ""
|
||||||
// TODO: Remove this since Sveltekit offers the CSRF protection via origin check
|
// TODO: Remove this since Sveltekit offers the CSRF protection via origin check
|
||||||
const csrfTokenResponse = await fetch("/auth/csrf")
|
const csrfTokenResponse = await fetch(`${basePath}/auth/csrf`)
|
||||||
const { csrfToken } = await csrfTokenResponse.json()
|
const { csrfToken } = await csrfTokenResponse.json()
|
||||||
const res = await fetch(`/auth/signout`, {
|
const res = await fetch(`${basePath}/auth/signout`, {
|
||||||
method: "post",
|
method: "post",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/x-www-form-urlencoded",
|
"Content-Type": "application/x-www-form-urlencoded",
|
||||||
|
|||||||
@@ -204,6 +204,7 @@
|
|||||||
import type { Handle, RequestEvent } from "@sveltejs/kit"
|
import type { Handle, RequestEvent } from "@sveltejs/kit"
|
||||||
|
|
||||||
import { dev } from "$app/environment"
|
import { dev } from "$app/environment"
|
||||||
|
import { base } from "$app/paths"
|
||||||
import { env } from "$env/dynamic/private"
|
import { env } from "$env/dynamic/private"
|
||||||
|
|
||||||
import { Auth } from "@auth/core"
|
import { Auth } from "@auth/core"
|
||||||
@@ -216,7 +217,7 @@ export async function getSession(
|
|||||||
config.secret ??= env.AUTH_SECRET
|
config.secret ??= env.AUTH_SECRET
|
||||||
config.trustHost ??= true
|
config.trustHost ??= true
|
||||||
|
|
||||||
const prefix = config.prefix ?? "/auth"
|
const prefix = config.prefix ?? `${base}/auth`
|
||||||
const url = new URL(prefix + "/session", req.url)
|
const url = new URL(prefix + "/session", req.url)
|
||||||
const request = new Request(url, { headers: req.headers })
|
const request = new Request(url, { headers: req.headers })
|
||||||
const response = await Auth(request, config)
|
const response = await Auth(request, config)
|
||||||
@@ -236,7 +237,7 @@ export interface SvelteKitAuthConfig extends AuthConfig {
|
|||||||
* If you change the default value,
|
* If you change the default value,
|
||||||
* you must also update the callback URL used by the [providers](https://authjs.dev/reference/core/providers).
|
* you must also update the callback URL used by the [providers](https://authjs.dev/reference/core/providers).
|
||||||
*
|
*
|
||||||
* @default "/auth"
|
* @default `${base}/auth` - `base` is the base path of your SvelteKit app, configured in `svelte.config.js`.
|
||||||
*/
|
*/
|
||||||
prefix?: string
|
prefix?: string
|
||||||
}
|
}
|
||||||
@@ -260,7 +261,7 @@ function AuthHandle(svelteKitAuthOptions: SvelteKitAuthConfig | DynamicSvelteKit
|
|||||||
typeof svelteKitAuthOptions === "object"
|
typeof svelteKitAuthOptions === "object"
|
||||||
? svelteKitAuthOptions
|
? svelteKitAuthOptions
|
||||||
: await svelteKitAuthOptions(event)
|
: await svelteKitAuthOptions(event)
|
||||||
const { prefix = "/auth" } = authOptions
|
const { prefix = `${base}/auth` } = authOptions
|
||||||
const { url, request } = event
|
const { url, request } = event
|
||||||
|
|
||||||
event.locals.getSession ??= () => getSession(request, authOptions)
|
event.locals.getSession ??= () => getSession(request, authOptions)
|
||||||
@@ -285,6 +286,7 @@ export function SvelteKitAuth(options: SvelteKitAuthConfig | DynamicSvelteKitAut
|
|||||||
if (typeof options === "object") {
|
if (typeof options === "object") {
|
||||||
options.secret ??= env.AUTH_SECRET
|
options.secret ??= env.AUTH_SECRET
|
||||||
options.trustHost ??= !!(env.AUTH_TRUST_HOST ?? env.VERCEL ?? dev)
|
options.trustHost ??= !!(env.AUTH_TRUST_HOST ?? env.VERCEL ?? dev)
|
||||||
|
options.prefix ??= `${base}/auth`
|
||||||
}
|
}
|
||||||
return AuthHandle(options)
|
return AuthHandle(options)
|
||||||
}
|
}
|
||||||
|
|||||||
1400
pnpm-lock.yaml
generated
1400
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user