mirror of
https://github.com/SrIzan10/next-auth.git
synced 2026-05-01 10:55:20 +00:00
A living session could be a requirement for specific pages (like dashboards). If it doesn’t exist, the user should be redirected to a page asking them to sign in again.
Sometimes, a user might log out by accident, or by deleting cookies on purpose. If that happens (e.g. on a separate tab), then `useSession({ required: true })` should detect the absence of a session cookie and always return a non-nullable Session object type.
When `required: true` is set, the default behavior will be to redirect the user to the sign-in page. This can be overridden by an `action()` callback:
```js
const session = useSession({
required: true,
action() {
// ....
}
})
if (session.status === "Loading") return "Loading or not authenticated..."
// session.data is always defined here.
```
Co-authored-by: Kristóf Poduszló <kripod@protonmail.com>
Co-authored-by: Lluis Agusti <hi@llu.lu>
BREAKING CHANGE:
The `useSession` hook now returns an object. Here is how to accommodate for this change:
```diff
- const [ session, loading ] = useSession()
+ const { data: session, status } = useSession()
+ const loading = status === "loading"
```
With the new `status` option, you can test states much more clearly.
100 lines
2.5 KiB
TypeScript
100 lines
2.5 KiB
TypeScript
import * as client from "next-auth/react"
|
|
import { nextReq } from "./test-helpers"
|
|
|
|
const clientSession = {
|
|
user: {
|
|
name: "Bruce",
|
|
email: "bruce@lee.com",
|
|
image: "path/to/img",
|
|
},
|
|
accessToken: "123z",
|
|
expires: "1234",
|
|
}
|
|
|
|
/**
|
|
* $ExpectType
|
|
* | { data: Session; status: "authenticated"; }
|
|
* | { data: null; status: "unauthenticated" | "loading"; }
|
|
* | { //// data: Session; status: "authenticated"; }
|
|
* | { data: null; status: "loading"; }
|
|
*/
|
|
client.useSession()
|
|
|
|
// $ExpectType { data: Session; status: "authenticated"; } | { data: null; status: "loading"; }
|
|
const session = client.useSession({ required: true })
|
|
if (session.status === "loading") {
|
|
// $ExpectType null
|
|
session.data
|
|
} else {
|
|
// $ExpectType Session
|
|
session.data
|
|
}
|
|
|
|
// $ExpectType Promise<Session | null>
|
|
client.getSession({ req: nextReq })
|
|
|
|
// $ExpectType Promise<Record<string, ClientSafeProvider> | null>
|
|
client.getProviders()
|
|
|
|
// $ExpectType Promise<string | null>
|
|
client.getCsrfToken({ req: nextReq })
|
|
|
|
// $ExpectType Promise<string | null>
|
|
client.getCsrfToken({ ctx: { req: nextReq } })
|
|
|
|
// $ExpectType Promise<undefined>
|
|
client.signIn("github", { callbackUrl: "foo" }, { login: "username" })
|
|
|
|
// $ExpectType Promise<SignInResponse | undefined>
|
|
client.signIn("credentials", { callbackUrl: "foo", redirect: true })
|
|
|
|
// $ExpectType Promise<SignInResponse | undefined>
|
|
client.signIn("credentials", { redirect: false })
|
|
|
|
// $ExpectType Promise<SignInResponse | undefined>
|
|
client.signIn("email", { callbackUrl: "foo", redirect: false })
|
|
|
|
// $ExpectType Promise<SignInResponse | undefined>
|
|
client.signIn("email", { callbackUrl: "foo", redirect: true })
|
|
|
|
// $ExpectType Promise<undefined>
|
|
client.signOut()
|
|
|
|
// $ExpectType Promise<undefined>
|
|
client.signOut({ callbackUrl: "https://foo.com/callback", redirect: true })
|
|
|
|
// $ExpectType Promise<SignOutResponse>
|
|
client.signOut({ callbackUrl: "https://foo.com/callback", redirect: false })
|
|
|
|
// $ExpectType ReactElement<any, any> | null
|
|
client.SessionProvider({
|
|
children: null,
|
|
session: clientSession,
|
|
baseUrl: "https://foo.com",
|
|
basePath: "/",
|
|
staleTime: 1234,
|
|
})
|
|
|
|
// $ExpectType ReactElement<any, any> | null
|
|
client.SessionProvider({
|
|
children: null,
|
|
session: clientSession,
|
|
})
|
|
|
|
// $ExpectType ReactElement<any, any> | null
|
|
client.SessionProvider({
|
|
children: null,
|
|
})
|
|
|
|
// $ExpectType ReactElement<any, any> | null
|
|
client.SessionProvider({
|
|
children: null,
|
|
session: {
|
|
expires: "",
|
|
},
|
|
baseUrl: "https://foo.com",
|
|
basePath: "/",
|
|
staleTime: 1234,
|
|
refetchInterval: 4321,
|
|
})
|