Blazej пре 3 година
родитељ
комит
bcf8a6f2b3

+ 5 - 0
pom.xml

@@ -67,6 +67,11 @@
             <artifactId>java-jwt</artifactId>
             <version>3.19.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.api-client</groupId>
+            <artifactId>google-api-client</artifactId>
+            <version>1.34.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 3 - 0
src/main/java/com/example/plantsforyou/appuser/LoginCredentials.java

@@ -3,6 +3,7 @@ package com.example.plantsforyou.appuser;
 public class LoginCredentials {
     private String username;
     private String password;
+    private Boolean oAuth;
 
     public String getUsername() {
         return username;
@@ -11,4 +12,6 @@ public class LoginCredentials {
     public String getPassword() {
         return password;
     }
+
+    public Boolean getOAuth() { return oAuth;  }
 }

+ 29 - 4
src/main/java/com/example/plantsforyou/filter/CustomAuthenticationFilter.java

@@ -4,23 +4,25 @@ import com.auth0.jwt.JWT;
 import com.auth0.jwt.algorithms.Algorithm;
 import com.example.plantsforyou.appuser.AppUser;
 import com.example.plantsforyou.appuser.LoginCredentials;
+import com.example.plantsforyou.oAuth.oAuthService;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.NoArgsConstructor;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.web.bind.annotation.CrossOrigin;
 
 import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedReader;
 import java.io.IOException;
+import java.security.GeneralSecurityException;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -32,6 +34,8 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
     private final AuthenticationManager authenticationManager;
     private final ObjectMapper objectMapper = new ObjectMapper();
+    private final oAuthService authService = new oAuthService();
+
 
     public CustomAuthenticationFilter(AuthenticationManager authenticationManager){
         this.authenticationManager = authenticationManager;
@@ -51,9 +55,28 @@ public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFi
 
             String email = credentials.getUsername();
             String password = credentials.getPassword();
+            Boolean oAuth = credentials.getOAuth();
             log.info("Email is: {}", email);
             log.info("Password is: {}", password);
-            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, password);
+            UsernamePasswordAuthenticationToken authenticationToken = null;
+            if(oAuth){
+                GoogleIdToken idToken = authService.validate(password);
+                if(idToken != null) {
+                    GoogleIdToken.Payload payload =  idToken.getPayload();
+                    try {
+                        UserDetails userDetails = authService.findByEmail(payload.getEmail());
+                        authenticationToken = new UsernamePasswordAuthenticationToken(userDetails.getUsername(), null);
+                    }
+                    catch(UsernameNotFoundException e){
+                        authService.singUpUser(payload);
+                        authenticationToken = new UsernamePasswordAuthenticationToken(payload.getEmail(), null);
+
+                    }
+                }
+            }
+            else{
+                authenticationToken = new UsernamePasswordAuthenticationToken(email, password);
+            }
             return authenticationManager.authenticate(authenticationToken);
         }
         catch (AuthenticationException e){
@@ -62,6 +85,8 @@ public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFi
         }
         catch(IOException e){
             throw new IllegalArgumentException(e.getMessage());
+        } catch (GeneralSecurityException e) {
+            throw new IllegalStateException(e.getMessage());
         }
     }
 

+ 46 - 0
src/main/java/com/example/plantsforyou/oAuth/oAuthService.java

@@ -0,0 +1,46 @@
+package com.example.plantsforyou.oAuth;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.appuser.AppUserRepository;
+import com.example.plantsforyou.appuser.AppUserRole;
+import com.example.plantsforyou.filter.CustomAuthenticationFilter;
+import com.example.plantsforyou.appuser.AppUserService;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.json.JsonFactory;
+import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.Collections;
+import java.util.Optional;
+
+@Service
+public class oAuthService {
+    HttpTransport transport;
+    JsonFactory factory;
+    AppUserService userService;
+
+    public GoogleIdToken validate(String token) throws GeneralSecurityException, IOException {
+        try {
+            GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, factory)
+                    .setAudience(Collections.singletonList("676799456601-2962t9gojc4bgukov2ptmte48m3pqtlc.apps.googleusercontent.com"))
+                    .build();
+            return verifier.verify(token);
+        }
+        catch (GeneralSecurityException | IOException e){
+            return null;
+        }
+    }
+    public UserDetails findByEmail(String email){ return userService.loadUserByUsername(email); }
+
+    public void singUpUser(GoogleIdToken.Payload payload){
+        AppUser user = new AppUser((String) payload.get("name"), (String) payload.get("family_name"), payload.getEmail(), AppUserRole.USER);
+        userService.signUpUser(user);
+    }
+}