+
Passwort vergessen?
+ `,
+})
+export class OAuth2CallbackComponent implements OnInit {
+ error: string | null = null;
+
+ constructor(
+ private route: ActivatedRoute,
+ private router: Router,
+ private authService: AuthService
+ ) {}
+
+ ngOnInit(): void {
+ // Check for code in URL params
+ this.route.queryParams.subscribe(params => {
+ const code = params['code'];
+
+ if (code) {
+ // Exchange GitHub code for a JWT token
+ this.authService.githubAuth(code).subscribe({
+ next: () => {
+ // Redirect to home after successful authentication
+ this.router.navigate(['/home']);
+ },
+ error: (err) => {
+ console.error('GitHub authentication error:', err);
+ this.error = err.error?.message || "Authentication failed. Please try again.";
+ console.log('Error details:', err);
+
+ // Redirect back to landing page after showing error
+ setTimeout(() => {
+ this.router.navigate(['/']);
+ }, 3000);
+ }
+ });
+ } else {
+ this.error = "Authentication failed. No authorization code received.";
+
+ // Redirect back to landing page after showing error
+ setTimeout(() => {
+ this.router.navigate(['/']);
+ }, 3000);
+ }
+ });
+ }
+}
diff --git a/frontend/src/app/service/auth.service.ts b/frontend/src/app/service/auth.service.ts
index f1cfbe9..c517d88 100644
--- a/frontend/src/app/service/auth.service.ts
+++ b/frontend/src/app/service/auth.service.ts
@@ -1,7 +1,7 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject, Observable, tap } from 'rxjs';
-import { Router } from '@angular/router';
+import { Router, ActivatedRoute } from '@angular/router';
import { LoginRequest } from '../model/auth/LoginRequest';
import { RegisterRequest } from '../model/auth/RegisterRequest';
import { AuthResponse } from '../model/auth/AuthResponse';
@@ -17,20 +17,41 @@ const USER_KEY = 'user';
export class AuthService {
private authUrl = `${environment.apiUrl}/auth`;
private userUrl = `${environment.apiUrl}/users`;
+ private oauthUrl = `${environment.apiUrl}/oauth2`;
userSubject: BehaviorSubject
;
constructor(
private http: HttpClient,
- private router: Router
+ private router: Router,
+ private route: ActivatedRoute
) {
this.userSubject = new BehaviorSubject(this.getUserFromStorage());
+ // Check for token in URL (OAuth callback) on initialization
+ this.route.queryParams.subscribe(params => {
+ const token = params['token'];
+ if (token) {
+ this.handleOAuthCallback(token);
+ }
+ });
+
if (this.getToken()) {
this.loadCurrentUser();
}
}
+ private handleOAuthCallback(token: string): void {
+ this.setToken(token);
+ this.loadCurrentUser();
+ // Clean up the URL by removing the token
+ this.router.navigate([], {
+ relativeTo: this.route,
+ queryParams: {},
+ replaceUrl: true
+ });
+ }
+
public get currentUserValue(): User | null {
return this.userSubject.value;
}
@@ -48,6 +69,16 @@ export class AuthService {
return this.http.post(`${this.authUrl}/register`, registerRequest);
}
+ githubAuth(code: string): Observable {
+ return this.http.post(`${this.oauthUrl}/github/callback`, { code }).pipe(
+ tap((response) => {
+ console.log(response.token);
+ this.setToken(response.token);
+ this.loadCurrentUser();
+ })
+ );
+ }
+
logout(): void {
localStorage.removeItem(TOKEN_KEY);
localStorage.removeItem(USER_KEY);
From 74798949c652836c8735bff1740dc15f67ab66d3 Mon Sep 17 00:00:00 2001
From: Constantin Simonis
Date: Wed, 21 May 2025 10:33:58 +0200
Subject: [PATCH 010/167] style: clean up whitespace in multiple files
---
.../de/szut/casino/CasinoApplication.java | 3 --
.../casino/blackjack/BlackJackService.java | 1 -
.../casino/config/OpenAPIConfiguration.java | 1 -
.../java/de/szut/casino/config/WebConfig.java | 12 ++---
.../casino/deposit/DepositController.java | 4 +-
.../exceptions/EmailNotVerifiedException.java | 2 -
.../szut/casino/security/AuthController.java | 12 ++---
.../de/szut/casino/security/CorsFilter.java | 8 +--
.../CustomJwtAuthenticationConverter.java | 2 +-
.../casino/security/GitHubController.java | 22 ++------
.../szut/casino/security/GitHubService.java | 51 +++++++++----------
.../szut/casino/security/SecurityConfig.java | 32 ++++++------
.../casino/security/dto/AuthResponseDto.java | 2 +-
.../casino/security/dto/LoginRequestDto.java | 2 +-
.../security/jwt/JwtAuthenticationFilter.java | 4 +-
.../oauth2/CustomOAuth2UserService.java | 28 +++++-----
.../security/oauth2/GitHubOAuth2UserInfo.java | 2 +-
.../OAuth2AuthenticationSuccessHandler.java | 9 ++--
.../oauth2/OAuth2UserInfoFactory.java | 4 +-
.../casino/security/oauth2/UserPrincipal.java | 2 +-
.../service/UserDetailsServiceImpl.java | 12 ++---
.../java/de/szut/casino/user/UserEntity.java | 21 +++-----
.../szut/casino/user/UserMappingService.java | 2 +-
.../de/szut/casino/user/UserRepository.java | 8 +--
.../java/de/szut/casino/user/UserService.java | 16 +++---
.../szut/casino/user/dto/CreateUserDto.java | 4 +-
.../transaction/TransactionController.java | 2 +-
27 files changed, 119 insertions(+), 149 deletions(-)
diff --git a/backend/src/main/java/de/szut/casino/CasinoApplication.java b/backend/src/main/java/de/szut/casino/CasinoApplication.java
index 9a5db34..9e1f3b2 100644
--- a/backend/src/main/java/de/szut/casino/CasinoApplication.java
+++ b/backend/src/main/java/de/szut/casino/CasinoApplication.java
@@ -8,9 +8,6 @@ import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
-import org.springframework.mail.MailException;
-import org.springframework.mail.MailSender;
-import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.web.client.RestTemplate;
diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java
index 9bf591f..c417309 100644
--- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java
+++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java
@@ -112,7 +112,6 @@ public class BlackJackService {
dealCardToPlayer(game);
dealCardToSplitHand(game);
- return blackJackGameRepository.save(game);
}
private BlackJackGameEntity processGameBasedOnState(BlackJackGameEntity game) {
diff --git a/backend/src/main/java/de/szut/casino/config/OpenAPIConfiguration.java b/backend/src/main/java/de/szut/casino/config/OpenAPIConfiguration.java
index 7af90b9..75cac52 100644
--- a/backend/src/main/java/de/szut/casino/config/OpenAPIConfiguration.java
+++ b/backend/src/main/java/de/szut/casino/config/OpenAPIConfiguration.java
@@ -1,7 +1,6 @@
package de.szut.casino.config;
-
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
diff --git a/backend/src/main/java/de/szut/casino/config/WebConfig.java b/backend/src/main/java/de/szut/casino/config/WebConfig.java
index bb11293..ecc21be 100644
--- a/backend/src/main/java/de/szut/casino/config/WebConfig.java
+++ b/backend/src/main/java/de/szut/casino/config/WebConfig.java
@@ -18,12 +18,12 @@ public class WebConfig {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
- .allowedOrigins(frontendHost)
- .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
- .allowedHeaders("*")
- .exposedHeaders("*")
- .allowCredentials(true)
- .maxAge(3600);
+ .allowedOrigins(frontendHost)
+ .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
+ .allowedHeaders("*")
+ .exposedHeaders("*")
+ .allowCredentials(true)
+ .maxAge(3600);
}
};
}
diff --git a/backend/src/main/java/de/szut/casino/deposit/DepositController.java b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
index 522e47d..e64e428 100644
--- a/backend/src/main/java/de/szut/casino/deposit/DepositController.java
+++ b/backend/src/main/java/de/szut/casino/deposit/DepositController.java
@@ -53,8 +53,8 @@ public class DepositController {
.build())
.setQuantity(1L)
.build())
- .setSuccessUrl(frontendHost+"/home?success=true")
- .setCancelUrl(frontendHost+"/home?success=false")
+ .setSuccessUrl(frontendHost + "/home?success=true")
+ .setCancelUrl(frontendHost + "/home?success=false")
.setMode(SessionCreateParams.Mode.PAYMENT)
.build();
diff --git a/backend/src/main/java/de/szut/casino/exceptionHandling/exceptions/EmailNotVerifiedException.java b/backend/src/main/java/de/szut/casino/exceptionHandling/exceptions/EmailNotVerifiedException.java
index ea08367..af97d4e 100644
--- a/backend/src/main/java/de/szut/casino/exceptionHandling/exceptions/EmailNotVerifiedException.java
+++ b/backend/src/main/java/de/szut/casino/exceptionHandling/exceptions/EmailNotVerifiedException.java
@@ -1,7 +1,5 @@
package de.szut.casino.exceptionHandling.exceptions;
-import de.szut.casino.security.service.EmailService;
-
public class EmailNotVerifiedException extends Exception {
public EmailNotVerifiedException() {
super("Email not verified");
diff --git a/backend/src/main/java/de/szut/casino/security/AuthController.java b/backend/src/main/java/de/szut/casino/security/AuthController.java
index 27949c5..13a238e 100644
--- a/backend/src/main/java/de/szut/casino/security/AuthController.java
+++ b/backend/src/main/java/de/szut/casino/security/AuthController.java
@@ -1,9 +1,7 @@
package de.szut.casino.security;
-import de.szut.casino.exceptionHandling.ErrorDetails;
import de.szut.casino.exceptionHandling.exceptions.EmailNotVerifiedException;
import de.szut.casino.security.dto.AuthResponseDto;
-import de.szut.casino.security.dto.GithubCallbackDto;
import de.szut.casino.security.dto.LoginRequestDto;
import de.szut.casino.security.dto.ResetPasswordDto;
import de.szut.casino.security.service.AuthService;
@@ -24,7 +22,7 @@ public class AuthController {
@Autowired
private AuthService authService;
-
+
@Autowired
private GitHubService githubService;
@@ -42,11 +40,11 @@ public class AuthController {
@PostMapping("/verify")
public ResponseEntity verifyEmail(@RequestParam("token") String token) throws MessagingException, IOException {
- if (authService.verifyEmail(token)) {
- return ResponseEntity.badRequest().build();
- }
+ if (authService.verifyEmail(token)) {
+ return ResponseEntity.badRequest().build();
+ }
- return ResponseEntity.ok().build();
+ return ResponseEntity.ok().build();
}
@PostMapping("/recover-password")
diff --git a/backend/src/main/java/de/szut/casino/security/CorsFilter.java b/backend/src/main/java/de/szut/casino/security/CorsFilter.java
index 032088f..446864e 100644
--- a/backend/src/main/java/de/szut/casino/security/CorsFilter.java
+++ b/backend/src/main/java/de/szut/casino/security/CorsFilter.java
@@ -19,10 +19,10 @@ public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
-
+
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
-
+
// Allow requests from the frontend
response.setHeader("Access-Control-Allow-Origin", frontendHost);
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS");
@@ -30,12 +30,12 @@ public class CorsFilter implements Filter {
response.setHeader("Access-Control-Expose-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Max-Age", "3600");
-
+
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
-
+
chain.doFilter(req, res);
}
}
diff --git a/backend/src/main/java/de/szut/casino/security/CustomJwtAuthenticationConverter.java b/backend/src/main/java/de/szut/casino/security/CustomJwtAuthenticationConverter.java
index 9f5304e..1997ac7 100644
--- a/backend/src/main/java/de/szut/casino/security/CustomJwtAuthenticationConverter.java
+++ b/backend/src/main/java/de/szut/casino/security/CustomJwtAuthenticationConverter.java
@@ -7,7 +7,7 @@ import org.springframework.security.oauth2.server.resource.authentication.JwtAut
import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
public class CustomJwtAuthenticationConverter implements Converter {
-
+
@Override
public AbstractAuthenticationToken convert(Jwt source) {
JwtGrantedAuthoritiesConverter authoritiesConverter = new JwtGrantedAuthoritiesConverter();
diff --git a/backend/src/main/java/de/szut/casino/security/GitHubController.java b/backend/src/main/java/de/szut/casino/security/GitHubController.java
index 9c2f2bf..ea1f23e 100644
--- a/backend/src/main/java/de/szut/casino/security/GitHubController.java
+++ b/backend/src/main/java/de/szut/casino/security/GitHubController.java
@@ -2,26 +2,14 @@ package de.szut.casino.security;
import de.szut.casino.security.dto.AuthResponseDto;
import de.szut.casino.security.dto.GithubCallbackDto;
-import de.szut.casino.security.jwt.JwtUtils;
-import de.szut.casino.user.AuthProvider;
-import de.szut.casino.user.UserEntity;
-import de.szut.casino.user.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
-import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
-import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.view.RedirectView;
-import java.math.BigDecimal;
-import java.util.*;
-
@RestController
@RequestMapping("/oauth2/github")
public class GitHubController {
@@ -42,12 +30,12 @@ public class GitHubController {
@GetMapping("/authorize")
public RedirectView authorizeGithub() {
logger.info("Redirecting to GitHub for authorization");
-
- String authUrl = authorizationUri +
- "?client_id=" + clientId +
- "&redirect_uri=" + redirectUri +
+
+ String authUrl = authorizationUri +
+ "?client_id=" + clientId +
+ "&redirect_uri=" + redirectUri +
"&scope=user:email,read:user";
-
+
return new RedirectView(authUrl);
}
diff --git a/backend/src/main/java/de/szut/casino/security/GitHubService.java b/backend/src/main/java/de/szut/casino/security/GitHubService.java
index d6572d8..9ef8274 100644
--- a/backend/src/main/java/de/szut/casino/security/GitHubService.java
+++ b/backend/src/main/java/de/szut/casino/security/GitHubService.java
@@ -16,7 +16,6 @@ import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@@ -50,19 +49,19 @@ public class GitHubService {
try {
// Exchange code for access token
RestTemplate restTemplate = new RestTemplate();
-
+
// Create request body for token endpoint
Map requestBody = new HashMap<>();
requestBody.put("client_id", clientId);
requestBody.put("client_secret", clientSecret);
requestBody.put("code", code);
-
+
// Set headers
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");
-
+
HttpEntity