For certain use cases, you may want a mock adapter to simulate user authentication without involving an actual authentication server.
This approach is useful when building an app where user authentication is a feature but not a requirement. It also proves beneficial for running tests or in Storybook environments.
import { createOidc } from"oidc-spa";import { createMockOidc } from"oidc-spa/mock";import { z } from"zod";constdecodedIdTokenSchema=z.object({ sub:z.string(), preferred_username:z.string()});constoidc=!import.meta.env.VITE_OIDC_ISSUER?awaitcreateMockOidc({ isUserInitiallyLoggedIn:false,// This is only so we know where to redirect when // you call `logout({ redirectTo: "home" })` homeUrl:import.meata.env.BASE_URL, mockedTokens: { decodedIdToken: { sub:"123", preferred_username:"john doe" } satisfiesz.infer<typeof decodedIdTokenSchema> } }):awaitcreateOidc({ issuerUri:import.meta.env.VITE_OIDC_ISSUER, clientId:import.meta.env.VITE_OIDC_CLIENT_ID, BASE_URL:import.meta.env.BASE_URL, decodedIdTokenSchema });
src/oidc.ts
import { createReactOidc } from "oidc-spa/react";
import { createMockReactOidc } from "oidc-spa/mock/react";
import { z } from "zod";
const decodedIdTokenSchema = z.object({
sub: z.string(),
preferred_username: z.string()
});
const publicUrl = import.meta.env.BASE_URL;
export const { OidcProvider, useOidc, getOidc } =
!import.meta.env.VITE_OIDC_ISSUER ?
createMockReactOidc({
isUserInitiallyLoggedIn: false,
// This is only so we know where to redirect when
// you call `logout({ redirectTo: "home" })`
homeUrl: import.meta.env.BASE_URL,
mockedTokens: {
decodedIdToken: {
sub: "123",
preferred_username: "john doe"
} satisfies z.infer<typeof decodedIdTokenSchema>
}
}) :
createReactOidc({
issuerUri: import.meta.env.VITE_OIDC_ISSUER,
clientId: import.meta.env.VITE_OIDC_CLIENT_ID,
BASE_URL: import.meta.env.BASE_URL,
decodedIdTokenSchema
});