Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 

89 rader
2.4 KiB

  1. import { AuthOptions, Session } from "next-auth";
  2. import CredentialsProvider from "next-auth/providers/credentials";
  3. import { LOGIN_API_PATH } from "./api";
  4. export interface SessionStaff {
  5. id: number;
  6. teamId: number;
  7. isTeamLead: boolean;
  8. employType: string | null;
  9. /**
  10. * The join date in milliseconds since epoch
  11. */
  12. joinDate: number | null;
  13. }
  14. export interface SessionWithTokens extends Session {
  15. staff?: SessionStaff;
  16. role?: string;
  17. abilities?: string[];
  18. accessToken?: string;
  19. refreshToken?: string;
  20. isTeamLead?: boolean;
  21. }
  22. export interface ability {
  23. actionSubjectCombo: string;
  24. }
  25. export const authOptions: AuthOptions = {
  26. debug: process.env.NODE_ENV === "development",
  27. providers: [
  28. CredentialsProvider({
  29. id: "credentials",
  30. name: "Credentials",
  31. credentials: {
  32. username: { label: "Username", type: "text" },
  33. password: { label: "Password", type: "password" },
  34. },
  35. async authorize(credentials, req) {
  36. const res = await fetch(LOGIN_API_PATH, {
  37. method: "POST",
  38. body: JSON.stringify(credentials),
  39. headers: { "Content-Type": "application/json" },
  40. });
  41. const user = await res.json();
  42. if (res.ok && user) {
  43. return user;
  44. }
  45. return null;
  46. },
  47. }),
  48. ],
  49. pages: {
  50. signIn: "/login",
  51. },
  52. callbacks: {
  53. jwt(params) {
  54. // Add the data from user to the token
  55. const { token, user, account, trigger, session } = params;
  56. if (trigger === "update" && session?.accessToken && session?.refreshToken) {
  57. token.accessToken = session.accessToken
  58. token.refreshToken = session.refreshToken
  59. }
  60. let newToken = { ...token, ...user };
  61. return newToken;
  62. },
  63. session({ session, token }) {
  64. // console.log(token.accessToken as string | undefined)
  65. const sessionWithToken: SessionWithTokens = {
  66. ...session,
  67. role: token.role as string,
  68. // Add the data from the token to the session
  69. abilities: (token.abilities as ability[]).map(
  70. (item: ability) => item.actionSubjectCombo,
  71. ) as string[],
  72. accessToken: token.accessToken as string | undefined,
  73. refreshToken: token.refreshToken as string | undefined,
  74. staff: token.staff as SessionStaff,
  75. };
  76. // console.log(sessionWithToken)
  77. return sessionWithToken;
  78. },
  79. }
  80. };