next-bungie-auth
Version:
Next Bungie Auth is an open source Next.js library that provides a configurable solution for authenticating your users with Bungie.net
83 lines (82 loc) • 3.33 kB
JavaScript
import { getTokens } from "./internal/tokens";
import { clearAllCookies, getAllCookies, setAllCookies, } from "./internal/cookies";
import { refreshSession } from "./internal/session";
import { DefaultBungieAuthConfig } from "./internal/config";
import { createHandlers } from "./internal/handlers";
import { BungieAuthorizationError } from "./internal/error";
export { DefaultBungieAuthConfig };
export { BungieAuthorizationError };
export const createNextBungieAuth = (config) => {
if (!config.clientId || !config.clientSecret) {
throw new TypeError("Both clientId and clientSecret are required config options", {
cause: {
clientId: config.clientId,
clientSecret: config.clientSecret,
},
});
}
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!config.generateState) {
throw new TypeError("generateState is a required config option");
}
const defaultedConfig = {
...DefaultBungieAuthConfig,
...config,
};
const { handlers, catchAllHandler } = createHandlers(defaultedConfig);
return {
handlers,
catchAllHandler,
serverSideHelpers: {
clearServerSession: (cookies) => {
clearAllCookies(cookies, defaultedConfig);
},
requestNewTokens: async (grantType, value) => {
return await getTokens({
grantType,
value,
}, defaultedConfig);
},
updateServerSession: (tokens, issuedAt, cookies) => {
const offset = Date.now() - issuedAt.getTime();
const sessionAge = tokens.refresh_expires_in * 1000 - offset;
const accessAge = tokens.expires_in * 1000 - offset;
const accessExpires = new Date(Date.now() + accessAge);
setAllCookies({
tokens,
sessionAge,
accessAge,
accessExpires,
}, cookies, defaultedConfig);
},
getServerSession: (cookies) => {
const { bungieMembershipId, refreshToken, accessExpires, accessToken } = getAllCookies(cookies, defaultedConfig);
if (!bungieMembershipId || !refreshToken) {
return {
status: "unauthorized",
data: null,
};
}
if (!accessToken || accessExpires.getTime() < Date.now()) {
return {
status: "stale",
data: {
bungieMembershipId: bungieMembershipId,
},
};
}
return {
status: "authorized",
data: {
bungieMembershipId: bungieMembershipId,
accessToken: accessToken,
accessTokenExpiresAt: accessExpires.toISOString(),
},
};
},
getRefreshedServerSession: async (cookies) => {
return await refreshSession(cookies, defaultedConfig);
},
},
};
};