UNPKG

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

114 lines (113 loc) 3.55 kB
import { clearAllCookies, getAllCookies, setAllCookies } from "./cookies"; import { BungieAuthorizationError } from "./error"; import { getTokens } from "./tokens"; /** @internal */ export const refreshSession = async (cookies, config) => { const { bungieMembershipId, refreshToken } = getAllCookies(cookies, config); if (!bungieMembershipId || !refreshToken) { return { session: { status: "unauthorized", data: null, }, message: "No session found", }; } try { const tokens = await getTokens({ grantType: "refresh_token", value: refreshToken, }, config); const sessionAge = tokens.refresh_expires_in * 1000; const accessAge = tokens.expires_in * 1000; const accessExpires = new Date(Date.now() + accessAge); setAllCookies({ accessExpires, accessAge, sessionAge, tokens, }, cookies, config); return { session: { status: "authorized", data: { bungieMembershipId: tokens.membership_id, accessToken: tokens.access_token, accessTokenExpiresAt: accessExpires.toISOString(), }, }, message: "Session refreshed", }; } catch (err) { if (!(err instanceof BungieAuthorizationError)) { return { session: { status: "error", data: null, }, message: "Unknown error", }; } if (err.error_description === "SystemDisabled") { return { session: { status: "disabled", data: { bungieMembershipId, }, }, message: `${err.error}: ${err.error_description}`, }; } else { clearAllCookies(cookies, config); return { session: { status: "expired", data: null, }, message: `${err.error}: ${err.error_description}`, }; } } }; /** @internal */ export const getSession = (cookies, config) => { const { bungieMembershipId, refreshToken, accessToken, accessExpires } = getAllCookies(cookies, config); if (!bungieMembershipId || !refreshToken) { return { session: { status: "unauthorized", data: null, }, message: "No session found", }; } if (accessToken && accessExpires.getTime() - Date.now() / 1000 > config.sessionRefreshGracePeriod) { return { session: { status: "authorized", data: { bungieMembershipId, accessToken: accessToken, accessTokenExpiresAt: accessExpires.toISOString(), }, }, message: `Access token is still valid for ${Math.floor((accessExpires.getTime() - Date.now()) / 60000)} minutes`, }; } else { return { session: { status: "stale", data: { bungieMembershipId, }, }, message: "Access token is expired", }; } };