diff --git a/.idea/libraries/Maven__com_github_stephenc_jcip_jcip_annotations_1_0_1.xml b/.idea/libraries/Maven__com_github_stephenc_jcip_jcip_annotations_1_0_1.xml deleted file mode 100644 index 6fe105a..0000000 --- a/.idea/libraries/Maven__com_github_stephenc_jcip_jcip_annotations_1_0_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_api_client_google_api_client_1_31_5.xml b/.idea/libraries/Maven__com_google_api_client_google_api_client_1_31_5.xml new file mode 100644 index 0000000..ad3986c --- /dev/null +++ b/.idea/libraries/Maven__com_google_api_client_google_api_client_1_31_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml new file mode 100644 index 0000000..1c380d0 --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_gson_gson_2_8_6.xml b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_6.xml new file mode 100644 index 0000000..82a9f20 --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_gson_gson_2_8_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml new file mode 100644 index 0000000..848cecd --- /dev/null +++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml new file mode 100644 index 0000000..36e948e --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_30_0_android.xml b/.idea/libraries/Maven__com_google_guava_guava_30_0_android.xml new file mode 100644 index 0000000..754c8cf --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_30_0_android.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml new file mode 100644 index 0000000..4e15702 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_http_client_google_http_client_1_38_0.xml b/.idea/libraries/Maven__com_google_http_client_google_http_client_1_38_0.xml new file mode 100644 index 0000000..d26cd57 --- /dev/null +++ b/.idea/libraries/Maven__com_google_http_client_google_http_client_1_38_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_http_client_google_http_client_apache_v2_1_39_2.xml b/.idea/libraries/Maven__com_google_http_client_google_http_client_apache_v2_1_39_2.xml new file mode 100644 index 0000000..5dd2b53 --- /dev/null +++ b/.idea/libraries/Maven__com_google_http_client_google_http_client_apache_v2_1_39_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_http_client_google_http_client_gson_1_39_2.xml b/.idea/libraries/Maven__com_google_http_client_google_http_client_gson_1_39_2.xml new file mode 100644 index 0000000..fd62c06 --- /dev/null +++ b/.idea/libraries/Maven__com_google_http_client_google_http_client_gson_1_39_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml new file mode 100644 index 0000000..bacaa45 --- /dev/null +++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_oauth_client_google_oauth_client_1_31_2.xml b/.idea/libraries/Maven__com_google_oauth_client_google_oauth_client_1_31_2.xml new file mode 100644 index 0000000..f4e50b3 --- /dev/null +++ b/.idea/libraries/Maven__com_google_oauth_client_google_oauth_client_1_31_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_nimbusds_content_type_2_1.xml b/.idea/libraries/Maven__com_nimbusds_content_type_2_1.xml deleted file mode 100644 index 04318af..0000000 --- a/.idea/libraries/Maven__com_nimbusds_content_type_2_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_nimbusds_lang_tag_1_4_4.xml b/.idea/libraries/Maven__com_nimbusds_lang_tag_1_4_4.xml deleted file mode 100644 index 81aa85c..0000000 --- a/.idea/libraries/Maven__com_nimbusds_lang_tag_1_4_4.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_nimbusds_nimbus_jose_jwt_8_20_2.xml b/.idea/libraries/Maven__com_nimbusds_nimbus_jose_jwt_8_20_2.xml deleted file mode 100644 index b784b72..0000000 --- a/.idea/libraries/Maven__com_nimbusds_nimbus_jose_jwt_8_20_2.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_nimbusds_oauth2_oidc_sdk_8_36_1.xml b/.idea/libraries/Maven__com_nimbusds_oauth2_oidc_sdk_8_36_1.xml deleted file mode 100644 index 2b18184..0000000 --- a/.idea/libraries/Maven__com_nimbusds_oauth2_oidc_sdk_8_36_1.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_6.xml b/.idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_6.xml deleted file mode 100644 index 62b0e23..0000000 --- a/.idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_6.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_15.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_15.xml new file mode 100644 index 0000000..c88c2b7 --- /dev/null +++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_15.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_grpc_grpc_context_1_22_1.xml b/.idea/libraries/Maven__io_grpc_grpc_context_1_22_1.xml new file mode 100644 index 0000000..2a06e45 --- /dev/null +++ b/.idea/libraries/Maven__io_grpc_grpc_context_1_22_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml b/.idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml new file mode 100644 index 0000000..f25b99b --- /dev/null +++ b/.idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_opencensus_opencensus_api_0_24_0.xml b/.idea/libraries/Maven__io_opencensus_opencensus_api_0_24_0.xml new file mode 100644 index 0000000..4ae663a --- /dev/null +++ b/.idea/libraries/Maven__io_opencensus_opencensus_api_0_24_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_opencensus_opencensus_contrib_http_util_0_24_0.xml b/.idea/libraries/Maven__io_opencensus_opencensus_contrib_http_util_0_24_0.xml new file mode 100644 index 0000000..298f3b5 --- /dev/null +++ b/.idea/libraries/Maven__io_opencensus_opencensus_contrib_http_util_0_24_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_13.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_13.xml new file mode 100644 index 0000000..63bee0e --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_14.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_14.xml new file mode 100644 index 0000000..427f319 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_5.xml b/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_5.xml new file mode 100644 index 0000000..a4c92ee --- /dev/null +++ b/.idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_configuration_processor_2_4_4.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_configuration_processor_2_4_4.xml new file mode 100644 index 0000000..6b72d9f --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_configuration_processor_2_4_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_oauth2_client_2_4_4.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_oauth2_client_2_4_4.xml deleted file mode 100644 index 5db5c13..0000000 --- a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_oauth2_client_2_4_4.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_client_5_4_5.xml b/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_client_5_4_5.xml deleted file mode 100644 index b840ac8..0000000 --- a/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_client_5_4_5.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_core_5_4_5.xml b/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_core_5_4_5.xml deleted file mode 100644 index d929a63..0000000 --- a/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_core_5_4_5.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_jose_5_4_5.xml b/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_jose_5_4_5.xml deleted file mode 100644 index c758014..0000000 --- a/.idea/libraries/Maven__org_springframework_security_spring_security_oauth2_jose_5_4_5.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/saveactions_settings.xml b/.idea/saveactions_settings.xml new file mode 100644 index 0000000..85aedc2 --- /dev/null +++ b/.idea/saveactions_settings.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..2bacd68 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/mcitmocks.iml b/mcitmocks.iml index 113bb99..3533e39 100644 --- a/mcitmocks.iml +++ b/mcitmocks.iml @@ -1,5 +1,10 @@ + + + @@ -14,7 +19,9 @@ - + + + @@ -29,14 +36,13 @@ - + - @@ -77,9 +83,6 @@ - - - @@ -121,5 +124,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index a9e8f3a..08dfeee 100644 --- a/pom.xml +++ b/pom.xml @@ -40,9 +40,25 @@ org.springframework.boot spring-boot-starter-security + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.google.oauth-client + google-oauth-client + 1.31.2 + + + com.google.api-client + google-api-client + 1.31.5 + org.springframework.boot - spring-boot-starter-oauth2-client + spring-boot-configuration-processor + true diff --git a/src/main/client/package.json b/src/main/client/package.json index 3c2679c..dca1268 100644 --- a/src/main/client/package.json +++ b/src/main/client/package.json @@ -14,7 +14,8 @@ "axios": "0.21.1", "node-sass": "^5.0.0", "react": "17.0.2", - "react-dom": "17.0.2" + "react-dom": "17.0.2", + "react-google-login": "^5.2.2" }, "devDependencies": { "@storybook/addon-actions": "6.2.8", diff --git a/src/main/client/src/components/Header/Header.tsx b/src/main/client/src/components/Header/Header.tsx index 3941928..89c3b66 100644 --- a/src/main/client/src/components/Header/Header.tsx +++ b/src/main/client/src/components/Header/Header.tsx @@ -1,16 +1,25 @@ import React from "react"; import { User } from "@types"; import "./Header.scss"; +import GoogleLogin from "react-google-login"; export interface HeaderProps { user: User | null; } const Header: React.FC<{}> = () => { + const onSuccess = (res: any) => { + console.log(res.tokenId); + }; + return (
_mcitmocks +
); diff --git a/src/main/client/yarn.lock b/src/main/client/yarn.lock index f9a58fc..131b4a9 100644 --- a/src/main/client/yarn.lock +++ b/src/main/client/yarn.lock @@ -12326,6 +12326,14 @@ react-fast-compare@^3.0.1, react-fast-compare@^3.2.0: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== +react-google-login@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/react-google-login/-/react-google-login-5.2.2.tgz#a20b46440c6c1610175ef75baf427118ff0e9859" + integrity sha512-JUngfvaSMcOuV0lFff7+SzJ2qviuNMQdqlsDJkUM145xkGPVIfqWXq9Ui+2Dr6jdJWH5KYdynz9+4CzKjI5u6g== + dependencies: + "@types/react" "*" + prop-types "^15.6.0" + react-helmet-async@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.9.tgz#5b9ed2059de6b4aab47f769532f9fbcbce16c5ca" diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthController.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthController.java new file mode 100644 index 0000000..8da6789 --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthController.java @@ -0,0 +1,42 @@ +package com.mcitmocks.mcitmocks.Auth; + +import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; +import com.mcitmocks.mcitmocks.User.User; +import com.mcitmocks.mcitmocks.User.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; + +@RestController +public class AuthController { + + @Autowired UserRepository userRepository; + + @PostMapping("/api/auth") + public AuthResponse authenticateUser(@RequestBody AuthRequest req) { + try { + JWTVerifier verifier = new JWTVerifier(); + GoogleIdToken idToken = verifier.verify(req.getAccessToken()); + if (idToken != null) { + GoogleIdToken.Payload googlePayload = idToken.getPayload(); + String userId = googlePayload.getSubject(); + String email = googlePayload.getEmail(); + Optional _user = userRepository.findById(userId); + User user; + if (_user.isPresent()) user = _user.get(); + else { + user = new User(userId, email); + userRepository.save(user); + } + String token = JWTUtil.generateToken(user); + return new AuthResponse(token); + } + } catch (Exception e) { + e.printStackTrace(); + } + return new AuthResponse(""); + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthRequest.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthRequest.java new file mode 100644 index 0000000..6c72237 --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthRequest.java @@ -0,0 +1,9 @@ +package com.mcitmocks.mcitmocks.Auth; + +public class AuthRequest { + private String accessToken; + + public String getAccessToken() { + return this.accessToken; + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthResponse.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthResponse.java new file mode 100644 index 0000000..b9ccda2 --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/AuthResponse.java @@ -0,0 +1,13 @@ +package com.mcitmocks.mcitmocks.Auth; + +public class AuthResponse { + private final String token; + + public AuthResponse(String token) { + this.token = token; + } + + public String getToken() { + return this.token; + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTAuthentication.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTAuthentication.java new file mode 100644 index 0000000..5a058b6 --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTAuthentication.java @@ -0,0 +1,37 @@ +package com.mcitmocks.mcitmocks.Auth; + +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; + +public class JWTAuthentication extends AbstractAuthenticationToken { + + private final String email; + + public JWTAuthentication(String token) { + super(null); + this.email = JWTUtil.getEmailFromToken(token); + if (this.email != null) this.setAuthenticated(true); + } + + @Override + public Object getCredentials() { + return this.email; + } + + @Override + public Object getPrincipal() { + return null; + } + + @Override + public Collection getAuthorities() { + return super.getAuthorities(); + } + + @Override + public void setAuthenticated(boolean authenticated) { + super.setAuthenticated(authenticated); + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTFilter.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTFilter.java new file mode 100644 index 0000000..e71db33 --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTFilter.java @@ -0,0 +1,29 @@ +package com.mcitmocks.mcitmocks.Auth; + +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Component +public class JWTFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal( + HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) + throws ServletException, IOException { + JWTAuthentication authentication = null; + final String requestTokenHeader = req.getHeader("Authorization"); + if (requestTokenHeader != null) { + String jwtString = requestTokenHeader.substring(7); + if (JWTUtil.verifyToken(jwtString)) authentication = new JWTAuthentication(jwtString); + } + SecurityContextHolder.getContext().setAuthentication(authentication); + filterChain.doFilter(req, res); + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTUtil.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTUtil.java new file mode 100644 index 0000000..4c9741a --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTUtil.java @@ -0,0 +1,43 @@ +package com.mcitmocks.mcitmocks.Auth; + +import com.mcitmocks.mcitmocks.User.User; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; + +public class JWTUtil { + private static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; + private static final String secret = "fake-secret"; + + public static String getEmailFromToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getSubject(); + } + + public static Date getExpirationFromToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody().getExpiration(); + } + + private static boolean isTokenExpired(String token) { + Date tokenExpiration = getExpirationFromToken((token)); + return tokenExpiration.after(new Date()); + } + + public static String generateToken(User user) { + return Jwts.builder() + .setSubject(user.getEmail()) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_VALIDITY * 1000)) + .signWith(SignatureAlgorithm.HS512, secret) + .compact(); + } + + public static boolean verifyToken(String token) { + return isTokenExpired(token); + } + + public static boolean verifyToken(String token, String email) { + String tokenEmail = getEmailFromToken(token); + return (email.equals(tokenEmail) && isTokenExpired(token)); + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTVerifier.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTVerifier.java new file mode 100644 index 0000000..aa14cdb --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/JWTVerifier.java @@ -0,0 +1,41 @@ +package com.mcitmocks.mcitmocks.Auth; + +import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.Collections; + +@Component +public class JWTVerifier { + + @Value("${google-client-id}") + private String googleClientId; + + private final GoogleIdTokenVerifier verifier; + + public JWTVerifier() { + System.out.println(this.getClientId()); + this.verifier = + new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new GsonFactory()) + .setAudience(Collections.singletonList(this.googleClientId)) + .build(); + } + + private String getClientId() { + return this.googleClientId; + } + + public GoogleIdToken verify(String token) { + try { + return this.verifier.verify(token); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/Auth/SecurityConfig.java b/src/main/java/com/mcitmocks/mcitmocks/Auth/SecurityConfig.java new file mode 100644 index 0000000..baf2895 --- /dev/null +++ b/src/main/java/com/mcitmocks/mcitmocks/Auth/SecurityConfig.java @@ -0,0 +1,32 @@ +package com.mcitmocks.mcitmocks.Auth; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired private JWTFilter jwtFilter; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.cors() + .and() + .csrf() + .disable() + .authorizeRequests() + .antMatchers("/", "/api/auth") + .permitAll() + .anyRequest() + .authenticated(); + + http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); + } +} diff --git a/src/main/java/com/mcitmocks/mcitmocks/User/User.java b/src/main/java/com/mcitmocks/mcitmocks/User/User.java index ddc32df..3be2045 100644 --- a/src/main/java/com/mcitmocks/mcitmocks/User/User.java +++ b/src/main/java/com/mcitmocks/mcitmocks/User/User.java @@ -4,37 +4,42 @@ import javax.persistence.*; @Entity -@Table(name="users") +@Table(name = "users") public class User { - @Id - @GeneratedValue(generator = "uuid2") - @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator") - private String id; + @Id + @GeneratedValue(generator = "uuid2") + @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator") + private String id; - private String email; - private String timeZone; + private String email; + private String timeZone; - protected User() {} + protected User() {} - public User(String email) { - this.email = email; - } + public User(String id, String email) { + this.id = id; + this.email = email; + } - public User(String email, String timeZone) { - this.email = email; - this.timeZone = timeZone; - } + public User(String email) { + this.email = email; + } - public String getId() { - return id; - } + public User(String id, String email, String timeZone) { + this.email = email; + this.timeZone = timeZone; + } - public String getEmail() { - return email; - } + public String getId() { + return id; + } - public String getTimeZone() { - return timeZone; - } + public String getEmail() { + return email; + } + + public String getTimeZone() { + return timeZone; + } } diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..96a421d --- /dev/null +++ b/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "properties": [ + { + "name": "google-client-id", + "type": "java.lang.String", + "description": "Description for google-client-id." + } + ] +} \ No newline at end of file diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 1cb7846..501f6e1 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -2,4 +2,11 @@ spring.jpa.hibernate.ddl-auto=create spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect spring.datasource.url=jdbc:postgresql://localhost:5432/mcitmocks_dev spring.datasource.hikari.username=mcitmocks -spring.datasource.hikari.password=password \ No newline at end of file +spring.datasource.hikari.password=password +#spring.security.oauth2.client.registration.google.client-id= +#spring.security.oauth2.client.registration.google.client-secret= +#spring.security.oauth2.client.registration.google.scope=email +#spring.security.oauth2.resourceserver.jwt.issuer-uri=https://accounts.google.com +#spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://www.googleapis.com/oauth2/v3/certs +google-client-id=970171967437-520d4shgbivtaeav1kqajk7466fudd2o.apps.googleusercontent.com +google-client-secret=jPonziIM1ZApWKGT-xomSLjy \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 257b306..e570aca 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,2 @@ -spring.profiles.active=dev \ No newline at end of file +spring.profiles.active=dev +google-client-id=970171967437-520d4shgbivtaeav1kqajk7466fudd2o.apps.googleusercontent.com \ No newline at end of file