Index: ReserveNGo-backend/pom.xml
===================================================================
--- ReserveNGo-backend/pom.xml	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/pom.xml	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -83,4 +83,23 @@
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-oauth2-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.api-client</groupId>
+            <artifactId>google-api-client</artifactId>
+            <version>2.7.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.http-client</groupId>
+            <artifactId>google-http-client</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.http-client</groupId>
+            <artifactId>google-http-client-gson</artifactId>
+            <version>2.0.2</version>
+        </dependency>
     </dependencies>
     <build>
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/bootstrap/DataHolder.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -3,8 +3,5 @@
 import jakarta.annotation.PostConstruct;
 import mk.ukim.finki.it.reservengo.model.domain.*;
-import mk.ukim.finki.it.reservengo.model.enumerations.EventType;
-import mk.ukim.finki.it.reservengo.model.enumerations.LocalType;
-import mk.ukim.finki.it.reservengo.model.enumerations.Role;
-import mk.ukim.finki.it.reservengo.model.enumerations.ProvidedService;
+import mk.ukim.finki.it.reservengo.model.enumerations.*;
 import mk.ukim.finki.it.reservengo.repository.*;
 import org.springframework.security.crypto.password.PasswordEncoder;
@@ -59,6 +56,9 @@
                     passwordEncoder.encode("password" + i),
                     "Phone" + i,
-                    Role.ROLE_CUSTOMER
+                    Role.ROLE_CUSTOMER,
+                    Provider.LOCAL,
+                    null
             );
+            customer.setEnabled(true);
             customers.add(customer);
         }
@@ -73,6 +73,9 @@
                     passwordEncoder.encode("password" + i),
                     "Phone" + i,
-                    Role.ROLE_LOCAL_WORKER
+                    Role.ROLE_LOCAL_WORKER,
+                    Provider.LOCAL,
+                    null
             );
+            localWorker.setEnabled(true);
             workers.add(localWorker);
         }
@@ -87,6 +90,9 @@
                     passwordEncoder.encode("password" + i),
                     "Phone" + i,
-                    Role.ROLE_LOCAL_MANAGER
+                    Role.ROLE_LOCAL_MANAGER,
+                    Provider.LOCAL,
+                    null
             );
+            manager.setEnabled(true);
             managers.add(manager);
         }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/ApplicationConfig.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/ApplicationConfig.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/ApplicationConfig.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -1,6 +1,10 @@
 package mk.ukim.finki.it.reservengo.config;
 
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.gson.GsonFactory;
 import mk.ukim.finki.it.reservengo.model.exceptions.EmailNotFoundException;
 import mk.ukim.finki.it.reservengo.repository.UserRepository;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -12,4 +16,6 @@
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.password.PasswordEncoder;
+
+import java.util.Collections;
 
 @Configuration
@@ -44,3 +50,10 @@
         return config.getAuthenticationManager();
     }
+
+    @Bean
+    public GoogleIdTokenVerifier googleIdTokenVerifier(@Value("${spring.security.oauth2.client.registration.google.client-id}") String clientId) {
+        return new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new GsonFactory())
+                .setAudience(Collections.singletonList(clientId))
+                .build();
+    }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/jwtDTO/JWTAuthenticationRequestDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/jwtDTO/JWTAuthenticationRequestDTO.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/jwtDTO/JWTAuthenticationRequestDTO.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -4,4 +4,5 @@
 import mk.ukim.finki.it.reservengo.model.domain.LocalManager;
 import mk.ukim.finki.it.reservengo.model.domain.LocalWorker;
+import mk.ukim.finki.it.reservengo.model.enumerations.Provider;
 import mk.ukim.finki.it.reservengo.model.enumerations.Role;
 
@@ -15,5 +16,5 @@
 
 
-    public Customer toCustomer(String encodedPassword) {
+    public Customer toCustomer(String encodedPassword, Provider provider, String providerId) {
         return new Customer(
                 firstName,
@@ -22,9 +23,11 @@
                 encodedPassword,
                 phoneNumber,
-                Role.ROLE_CUSTOMER
+                Role.ROLE_CUSTOMER,
+                provider,
+                providerId
         );
     }
 
-    public LocalWorker toLocalWorker(String encodedPassword) {
+    public LocalWorker toLocalWorker(String encodedPassword, Provider provider, String providerId) {
         return new LocalWorker(
                 firstName,
@@ -33,9 +36,11 @@
                 encodedPassword,
                 phoneNumber,
-                Role.ROLE_LOCAL_WORKER
+                Role.ROLE_LOCAL_WORKER,
+                provider,
+                providerId
         );
     }
 
-    public LocalManager toLocalManager(String encodedPassword) {
+    public LocalManager toLocalManager(String encodedPassword, Provider provider, String providerId) {
         return new LocalManager(
                 firstName,
@@ -44,5 +49,7 @@
                 encodedPassword,
                 phoneNumber,
-                Role.ROLE_LOCAL_MANAGER
+                Role.ROLE_LOCAL_MANAGER,
+                provider,
+                providerId
         );
     }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDetailsDTO.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDetailsDTO.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/dto/localDTO/DisplayLocalDetailsDTO.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -17,5 +17,5 @@
         List<ProvidedService> services,
         Double ratingAvg,
-        List<DisplayEventDTO> events, // ne gi vrakaj tuka eventite
+        List<DisplayEventDTO> events,
         List<String> localPhotos,
         String menuLink,
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Customer.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Customer.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Customer.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -3,4 +3,5 @@
 import jakarta.persistence.*;
 import lombok.*;
+import mk.ukim.finki.it.reservengo.model.enumerations.Provider;
 import mk.ukim.finki.it.reservengo.model.enumerations.Role;
 
@@ -13,8 +14,4 @@
 @Data
 public class Customer extends User {
-    public Customer(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
-        super(firstName, lastName, email, password, phoneNumber, userRole);
-    }
-
     @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
     private List<Reservation> reservations;
@@ -25,3 +22,7 @@
     @ManyToMany
     private List<Event> favouriteEvents;
+
+    public Customer(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole, Provider provider, String providerId) {
+        super(firstName, lastName, email, password, phoneNumber, userRole, provider, providerId);
+    }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalManager.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalManager.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalManager.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -10,4 +10,5 @@
 import lombok.NoArgsConstructor;
 import mk.ukim.finki.it.reservengo.model.enumerations.Position;
+import mk.ukim.finki.it.reservengo.model.enumerations.Provider;
 import mk.ukim.finki.it.reservengo.model.enumerations.Role;
 
@@ -24,6 +25,6 @@
     private Position position;
 
-    public LocalManager(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
-        super(firstName, lastName, email, password, phoneNumber, userRole);
+    public LocalManager(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole, Provider provider, String providerId) {
+        super(firstName, lastName, email, password, phoneNumber, userRole, provider, providerId);
     }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalWorker.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalWorker.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalWorker.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -10,4 +10,5 @@
 import lombok.NoArgsConstructor;
 import mk.ukim.finki.it.reservengo.model.enumerations.Position;
+import mk.ukim.finki.it.reservengo.model.enumerations.Provider;
 import mk.ukim.finki.it.reservengo.model.enumerations.Role;
 
@@ -24,6 +25,6 @@
     private Position position;
 
-    public LocalWorker(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
-        super(firstName, lastName, email, password, phoneNumber, userRole);
+    public LocalWorker(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole, Provider provider, String providerId) {
+        super(firstName, lastName, email, password, phoneNumber, userRole, provider, providerId);
     }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/User.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/User.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/User.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -8,4 +8,5 @@
 import lombok.NoArgsConstructor;
 import mk.ukim.finki.it.reservengo.config.listeners.Auditable;
+import mk.ukim.finki.it.reservengo.model.enumerations.Provider;
 import mk.ukim.finki.it.reservengo.model.enumerations.Role;
 import org.springframework.security.core.GrantedAuthority;
@@ -56,4 +57,8 @@
     private LocalDateTime verificationCodeExpiryDate;
 
+    private Provider provider;
+
+    private String providerId;
+
     public User(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
         this.firstName = firstName;
@@ -65,4 +70,15 @@
         this.enabled = true;
         this.lastActivityDate = LocalDateTime.now();
+    }
+
+    public User(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole, Provider provider, String providerId) {
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.email = email;
+        this.password = password;
+        this.phoneNumber = phoneNumber;
+        this.userRole = userRole;
+        this.provider = provider;
+        this.providerId = providerId;
     }
 
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/Provider.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/Provider.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/enumerations/Provider.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.it.reservengo.model.enumerations;
+
+public enum Provider {
+    LOCAL,
+    GOOGLE,
+    FACEBOOK
+}
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AuthServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AuthServiceImpl.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AuthServiceImpl.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -1,4 +1,7 @@
 package mk.ukim.finki.it.reservengo.service.impl;
 
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
+import com.google.common.base.VerifyException;
 import jakarta.mail.MessagingException;
 import mk.ukim.finki.it.reservengo.dto.jwtDTO.JWTAuthenticationRequestDTO;
@@ -9,4 +12,6 @@
 import mk.ukim.finki.it.reservengo.model.domain.LocalWorker;
 import mk.ukim.finki.it.reservengo.model.domain.User;
+import mk.ukim.finki.it.reservengo.model.enumerations.Provider;
+import mk.ukim.finki.it.reservengo.model.enumerations.Role;
 import mk.ukim.finki.it.reservengo.model.exceptions.EmailNotFoundException;
 import mk.ukim.finki.it.reservengo.repository.UserRepository;
@@ -18,6 +23,9 @@
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.security.GeneralSecurityException;
 import java.time.LocalDateTime;
 import java.util.Random;
+import java.util.UUID;
 
 @Service
@@ -32,6 +40,7 @@
     private final UserService userService;
     private final EmailService emailService;
-
-    public AuthServiceImpl(CustomerService customerService, LocalWorkerService localWorkerService, LocalManagerService localManagerService, JWTService jwtService, PasswordEncoder passwordEncoder, AuthenticationManager authenticationManager, UserRepository userRepository, UserService userService, EmailService emailService) {
+    private final GoogleIdTokenVerifier googleIdTokenVerifier;
+
+    public AuthServiceImpl(CustomerService customerService, LocalWorkerService localWorkerService, LocalManagerService localManagerService, JWTService jwtService, PasswordEncoder passwordEncoder, AuthenticationManager authenticationManager, UserRepository userRepository, UserService userService, EmailService emailService, GoogleIdTokenVerifier googleIdTokenVerifier) {
         this.customerService = customerService;
         this.localWorkerService = localWorkerService;
@@ -43,9 +52,10 @@
         this.userService = userService;
         this.emailService = emailService;
+        this.googleIdTokenVerifier = googleIdTokenVerifier;
     }
 
     @Override
     public JWTAuthenticationResponseDTO registerCustomer(JWTAuthenticationRequestDTO jwtAuthenticationRequestDTO) throws MessagingException {
-        Customer customer = jwtAuthenticationRequestDTO.toCustomer(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()));
+        Customer customer = jwtAuthenticationRequestDTO.toCustomer(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()), Provider.LOCAL, null);
 
         String verificationCode = generateVerificationCode();
@@ -65,5 +75,5 @@
         validateTokenEmail(token, jwtAuthenticationRequestDTO.email());
 
-        LocalWorker localWorker = jwtAuthenticationRequestDTO.toLocalWorker(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()));
+        LocalWorker localWorker = jwtAuthenticationRequestDTO.toLocalWorker(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()), Provider.LOCAL, null);
 
         localWorkerService.save(localWorker);
@@ -77,5 +87,5 @@
         validateTokenEmail(token, jwtAuthenticationRequestDTO.email());
 
-        LocalManager localManager = jwtAuthenticationRequestDTO.toLocalManager(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()));
+        LocalManager localManager = jwtAuthenticationRequestDTO.toLocalManager(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()), Provider.LOCAL, null);
 
         localManagerService.save(localManager);
@@ -89,5 +99,9 @@
         User user = userRepository.findByEmail(jwtLoginDTO.email()).orElseThrow(() -> new EmailNotFoundException(jwtLoginDTO.email()));
 
-        if (!user.isEnabled()) {
+        if (user.getProvider() != Provider.LOCAL) {
+            throw new MessagingException("This account must be logged in via " + user.getProvider() + ".");
+        }
+
+        if (!user.isEnabled() && user.getVerificationCodeExpiryDate() != null && user.getVerificationCode() != null) {
             throw new MessagingException("Account not verified. Please verify your email.");
         }
@@ -158,4 +172,154 @@
     }
 
+    @Override
+    public JWTAuthenticationResponseDTO registerGoogleCustomer(String idTokenString) {
+        GoogleIdToken.Payload payload = verifyGoogleIdTokenAndGetPayload(idTokenString);
+
+        String email = payload.getEmail();
+        String givenName = (String) payload.get("given_name");
+        String familyName = (String) payload.get("family_name");
+        String providerId = payload.getSubject();
+
+        return userRepository.findByEmail(email)
+                .map(user -> {
+                    String jwt = jwtService.generateToken(user);
+                    return JWTAuthenticationResponseDTO.fromUser(user, jwt);
+                })
+                .orElseGet(() -> {
+                    Customer customer = new Customer(
+                            givenName,
+                            familyName,
+                            email,
+                            passwordEncoder.encode(UUID.randomUUID().toString()),
+                            null,
+                            Role.ROLE_CUSTOMER,
+                            Provider.GOOGLE,
+                            providerId
+                    );
+                    customer.setEnabled(true);
+
+                    customerService.save(customer);
+
+                    String jwt = jwtService.generateToken(customer);
+                    return JWTAuthenticationResponseDTO.fromUser(customer, jwt);
+                });
+    }
+
+    @Override
+    public JWTAuthenticationResponseDTO registerGoogleLocalWorker(String idTokenString, String inviteToken) {
+        GoogleIdToken.Payload payload = verifyGoogleIdTokenAndGetPayload(idTokenString);
+
+        String email = payload.getEmail();
+        String givenName = (String) payload.get("given_name");
+        String familyName = (String) payload.get("family_name");
+        String providerId = payload.getSubject();
+
+        validateTokenEmail(inviteToken, email);
+
+        return userRepository.findByEmail(email)
+                .map(user -> {
+                    String jwt = jwtService.generateToken(user);
+                    return JWTAuthenticationResponseDTO.fromUser(user, jwt);
+                })
+                .orElseGet(() -> {
+                    LocalWorker localWorker = new LocalWorker(
+                            givenName,
+                            familyName,
+                            email,
+                            passwordEncoder.encode(UUID.randomUUID().toString()),
+                            null,
+                            Role.ROLE_LOCAL_WORKER,
+                            Provider.GOOGLE,
+                            providerId
+                    );
+                    localWorker.setEnabled(true);
+
+                    localWorkerService.save(localWorker);
+
+                    String jwt = jwtService.generateToken(localWorker);
+                    return JWTAuthenticationResponseDTO.fromUser(localWorker, jwt);
+                });
+    }
+
+    @Override
+    public JWTAuthenticationResponseDTO registerGoogleLocalManager(String idTokenString, String inviteToken) {
+        GoogleIdToken.Payload payload = verifyGoogleIdTokenAndGetPayload(idTokenString);
+
+        String email = payload.getEmail();
+        String givenName = (String) payload.get("given_name");
+        String familyName = (String) payload.get("family_name");
+        String providerId = payload.getSubject();
+
+        validateTokenEmail(inviteToken, email);
+
+        return userRepository.findByEmail(email)
+                .map(user -> {
+                    String jwt = jwtService.generateToken(user);
+                    return JWTAuthenticationResponseDTO.fromUser(user, jwt);
+                })
+                .orElseGet(() -> {
+                    LocalManager localManager = new LocalManager(
+                            givenName,
+                            familyName,
+                            email,
+                            passwordEncoder.encode(UUID.randomUUID().toString()),
+                            null,
+                            Role.ROLE_LOCAL_MANAGER,
+                            Provider.GOOGLE,
+                            providerId
+                    );
+                    localManager.setEnabled(true);
+
+                    localManagerService.save(localManager);
+
+                    String jwt = jwtService.generateToken(localManager);
+                    return JWTAuthenticationResponseDTO.fromUser(localManager, jwt);
+                });
+    }
+
+    @Override
+    public JWTAuthenticationResponseDTO loginWithGoogle(String idTokenString) {
+        GoogleIdToken.Payload payload = verifyGoogleIdTokenAndGetPayload(idTokenString);
+
+        String email = payload.getEmail();
+        User user = userRepository.findByEmail(email).orElseThrow(() -> new EmailNotFoundException(email));
+
+        if (!user.isEnabled()) {
+            throw new IllegalStateException("Account not enabled.");
+        }
+
+        String jwt = jwtService.generateToken(user);
+
+        userService.updateUserActivity(user.getId());
+
+        return JWTAuthenticationResponseDTO.fromUser(user, jwt);
+    }
+
+    private GoogleIdToken.Payload verifyGoogleIdTokenAndGetPayload(String idTokenString) {
+        if (idTokenString == null || idTokenString.isBlank()) {
+            throw new IllegalArgumentException("idToken is required");
+        }
+
+        GoogleIdToken idToken;
+        try {
+            idToken = googleIdTokenVerifier.verify(idTokenString);
+        } catch (GeneralSecurityException | IOException e) {
+            throw new VerifyException(e);
+        }
+
+        if (idToken == null) {
+            throw new IllegalArgumentException("Invalid Google ID token");
+        }
+
+        GoogleIdToken.Payload payload = idToken.getPayload();
+
+        Boolean emailVerified = (Boolean) payload.get("email_verified");
+        if (emailVerified != null && !emailVerified) {
+            throw new VerifyException("Google account email not verified");
+        }
+
+        return payload;
+    }
+
     private void validateTokenEmail(String token, String email) {
         String tokenEmail = jwtService.extractClaim(token, claims -> claims.get("email", String.class));
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/AuthService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/AuthService.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/AuthService.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -20,3 +20,11 @@
 
     void resendVerificationCode(String email) throws MessagingException;
+
+    JWTAuthenticationResponseDTO registerGoogleCustomer(String idToken);
+
+    JWTAuthenticationResponseDTO registerGoogleLocalWorker(String idToken, String inviteToken);
+
+    JWTAuthenticationResponseDTO registerGoogleLocalManager(String idToken, String inviteToken);
+
+    JWTAuthenticationResponseDTO loginWithGoogle(String idToken);
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -5,5 +5,4 @@
 import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
 import mk.ukim.finki.it.reservengo.model.domain.Customer;
-import mk.ukim.finki.it.reservengo.model.domain.Local;
 
 import java.util.List;
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -1,4 +1,5 @@
 package mk.ukim.finki.it.reservengo.web.advice;
 
+import com.google.common.base.VerifyException;
 import jakarta.mail.MessagingException;
 import mk.ukim.finki.it.reservengo.model.exceptions.*;
@@ -34,4 +35,9 @@
     public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
         return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(ex.getMessage());
+    }
+
+    @ExceptionHandler(IllegalStateException.class)
+    public ResponseEntity<String> handleIllegalStateException(IllegalStateException ex) {
+        return ResponseEntity.status(HttpStatus.FORBIDDEN).body(ex.getMessage());
     }
 
@@ -155,4 +161,9 @@
         return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
     }
+
+    @ExceptionHandler(VerifyException.class)
+    public ResponseEntity<String> handleVerifyException(VerifyException ex) {
+        return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
+    }
 }
 
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/AuthController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/AuthController.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/AuthController.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -42,4 +42,26 @@
     }
 
+    @PostMapping("/oauth/google/customer")
+    public ResponseEntity<JWTAuthenticationResponseDTO> registerGoogleCustomer(@RequestHeader(value = "X-Google-Token") String idToken) {
+        return new ResponseEntity<>(authenticationService.registerGoogleCustomer(idToken), HttpStatus.CREATED);
+    }
+
+    @PostMapping("/oauth/google/local-worker")
+    public ResponseEntity<JWTAuthenticationResponseDTO> registerGoogleLocalWorker(@RequestHeader(value = "X-Google-Token") String idToken,
+                                                                                  @RequestHeader(value = "Invite-Token") String inviteToken) {
+        return new ResponseEntity<>(authenticationService.registerGoogleLocalWorker(idToken, inviteToken), HttpStatus.CREATED);
+    }
+
+    @PostMapping("/oauth/google/local-manager")
+    public ResponseEntity<JWTAuthenticationResponseDTO> registerGoogleLocalManager(@RequestHeader(value = "X-Google-Token") String idToken,
+                                                                                   @RequestHeader(value = "Invite-Token") String inviteToken) {
+        return new ResponseEntity<>(authenticationService.registerGoogleLocalManager(idToken, inviteToken), HttpStatus.CREATED);
+    }
+
+    @PostMapping("/oauth/google/login")
+    public ResponseEntity<JWTAuthenticationResponseDTO> loginWithGoogle(@RequestHeader(value = "X-Google-Token") String idToken) {
+        return new ResponseEntity<>((authenticationService.loginWithGoogle(idToken)), HttpStatus.OK);
+    }
+
     @PatchMapping("/enable")
     public ResponseEntity<Void> reactivateAccount(@RequestBody JWTLoginDTO jwtLoginDTO) {
Index: ReserveNGo-backend/src/main/resources/application-dev.properties
===================================================================
--- ReserveNGo-backend/src/main/resources/application-dev.properties	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/resources/application-dev.properties	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -16,2 +16,5 @@
 spring.mail.properties.mail.smtp.starttls.enable=true
 spring.mail.properties.mail.debug=true
+
+spring.security.oauth2.client.registration.google.client-id=427559721166-5nn0mbhfjnh28vijgg0hdrm2ad2sqr5h.apps.googleusercontent.com
+spring.security.oauth2.client.registration.google.client-secret=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
Index: ReserveNGo-backend/src/main/resources/application-prod.properties
===================================================================
--- ReserveNGo-backend/src/main/resources/application-prod.properties	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/resources/application-prod.properties	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -14,2 +14,6 @@
 spring.mail.properties.mail.smtp.auth=true
 spring.mail.properties.mail.smtp.starttls.enable=true
+
+
+spring.security.oauth2.client.registration.google.client-id=${CLIENT_ID}
+spring.security.oauth2.client.registration.google.client-secret=${CLIENT_SECRET}
Index: ReserveNGo-backend/src/main/resources/application.properties
===================================================================
--- ReserveNGo-backend/src/main/resources/application.properties	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/main/resources/application.properties	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -7,2 +7,4 @@
 
 frontend.url=http://localhost:5173
+
+spring.security.oauth2.client.registration.google.scope=openid,profile,email
Index: ReserveNGo-backend/src/test/java/mk/ukim/finki/it/reservengo/ReserveNGoApplicationTests.java
===================================================================
--- ReserveNGo-backend/src/test/java/mk/ukim/finki/it/reservengo/ReserveNGoApplicationTests.java	(revision 586ed141976a2be6a947e280028c6665a513b3f8)
+++ ReserveNGo-backend/src/test/java/mk/ukim/finki/it/reservengo/ReserveNGoApplicationTests.java	(revision 5ec47d822a58f2984f696b16c10bb0df93c9f77e)
@@ -1,5 +1,4 @@
 package mk.ukim.finki.it.reservengo;
 
-import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
@@ -7,7 +6,3 @@
 class ReserveNGoApplicationTests {
 
-	@Test
-	void contextLoads() {
-	}
-
 }
