google-callback:
import express from 'express';
import passport from 'passport';
import fs from 'fs'; // ייבוא המודול של קריאת קבצים
import path from 'path'; // עבודה עם נתיבים

const router = express.Router();

// קריאת המוקי מקובץ JSON
const mockUsers = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../mock-users.json'), 'utf8'));

// פונקציה לבדיקת אם המשתמש מורשה
const isAuthorized = (email: string) => {
  return mockUsers.some((user: { email: string }) => user.email === email);
};

// סוגים למבני הנתונים של Google Auth
interface GoogleAuthRequest {
  code: string;
  redirect_uri: string;
}

interface GoogleAuthResponse {
  user: {
    id: string;
    email: string;
    firstName: string;
    lastName: string;
    avatar?: string;
  };
  token: string;
  refreshToken: string;
  expiresAt: Date;
  status: 'pending_approval' | 'approved' | 'declined';
}

// הגדרת טיפוס חדש עבור req.user כדי למנוע שגיאות
declare global {
  namespace Express {
    interface User {
      email?: string;
      profile?: {
        emails?: { value: string }[];
        firstName?: string;
        lastName?: string;
        avatar?: string;
      };
      accessToken?: string;
      refreshToken?: string;  // הוספתי את refreshToken
      expiresAt?: Date;  // הוספתי את expiresAt
    }
  }
}

router.get('/google/callback',
  passport.authenticate('google', { failureRedirect: '/login' }),
  (req, res) => {
    // אם אין מידע על המשתמש, הפנה ל-login
    if (!req.user) {
      return res.redirect('/login');
    }
    // בדיקת אם session קיים
    if (!req.session) {
      return res.redirect('/login'); // אם session לא קיים, הפנה ל-login
    }
    // עיבוד המידע של המשתמש (אם הוא בתוך profile או ישירות ב- user)
    const userEmail = req.user.email || req.user.profile?.emails?.[0].value;
    
    // אם אין מייל לאחר העיבוד, הפנה ל-login
    if (!userEmail) {
      return res.redirect('/login');
    }
    req.session.accessToken = req.user.accessToken;
    req.session.refreshToken = req.user.refreshToken;
    req.session.expiresAt = req.user.expiresAt;
    // המשך הקוד שלך
    if (isAuthorized(userEmail)) {
      res.redirect('/dashboard');  // הפנייה למערכת אם המשתמש מורשה
    } else {
      res.redirect('/unauthorized');  // הפנייה אם המשתמש לא מורשה
    }
  });
export default router;
google-login:
import express from 'express';
import passport from 'passport';

const router = express.Router();

router.get('/google', passport.authenticate('google', {
  scope: ['email', 'profile']
}));

export default router;
google-auth:
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
import passport from 'passport';

// Example function to find user by email (you can adapt to your DB logic)
export async function findUserByEmail(email: string) {
  // Example: Return a mock user, replace with actual DB query.
  return {
    email,
    authorized: true,  // Change this logic based on your authorization checks
  };
}

// Function to check if user is authorized
export const isUserAuthorized = async (email: string): Promise<boolean> => {
  const user = await findUserByEmail(email);
  return user != null && user.authorized;
};

// Passport Google OAuth Strategy
passport.use(new GoogleStrategy({
  clientID: process.env.GOOGLE_CLIENT_ID!,
  clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
  callbackURL: "http://localhost:3001/auth/google/callback",
}, async (accessToken, refreshToken, profile, done) => {
  const user = {
    id: profile.id,
    email: profile.emails?.[0].value,
    name: profile.displayName,
    accessToken,
    refreshToken,
    expiresAt: new Date(Date.now() + 3600 * 1000),  // Token expiration (1 hour)
  };

  return done(null, user);
}));

passport.serializeUser((user: any, done) => {
  done(null, user.id);
});

passport.deserializeUser(async (id: string, done) => {
  const user = await findUserByEmail(id);
  done(null, user);
});
this is my files for authentication with google. now I want an Updating that appropriate for working with console.cloud.google.com/auth/clients. pleas check file by file and offer me a changes.