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 (
);
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