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
JavaScript
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",
};
}
};