Files
unionflow-server-impl-quarkus/src/main/java/de/lions/unionflow/server/auth/AuthCallbackResource.java

139 lines
4.4 KiB
Java

package de.lions.unionflow.server.auth;
import jakarta.annotation.security.PermitAll;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Response;
import org.jboss.logging.Logger;
/**
* Resource temporaire pour gérer les callbacks d'authentification OAuth2/OIDC depuis l'application
* mobile.
*/
@Path("/auth")
@PermitAll
public class AuthCallbackResource {
private static final Logger log = Logger.getLogger(AuthCallbackResource.class);
/**
* Endpoint de callback pour l'authentification OAuth2/OIDC. Redirige vers l'application mobile
* avec les paramètres reçus.
*/
@GET
@Path("/callback")
public Response handleCallback(
@QueryParam("code") String code,
@QueryParam("state") String state,
@QueryParam("session_state") String sessionState,
@QueryParam("error") String error,
@QueryParam("error_description") String errorDescription) {
try {
// Log des paramètres reçus pour debug
log.infof("=== CALLBACK DEBUG === Code: %s, State: %s, Session State: %s, Error: %s, Error Description: %s",
code, state, sessionState, error, errorDescription);
// URL de redirection simple vers l'application mobile
String redirectUrl = "dev.lions.unionflow-mobile://callback";
// Si nous avons un code d'autorisation, c'est un succès
if (code != null && !code.isEmpty()) {
redirectUrl += "?code=" + code;
if (state != null && !state.isEmpty()) {
redirectUrl += "&state=" + state;
}
} else if (error != null) {
redirectUrl += "?error=" + error;
if (errorDescription != null) {
redirectUrl += "&error_description=" + errorDescription;
}
}
// Page HTML simple qui redirige automatiquement vers l'app mobile
String html =
"""
<!DOCTYPE html>
<html>
<head>
<title>Redirection vers UnionFlow</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
padding: 50px;
background: linear-gradient(135deg, #667eea 0%%, #764ba2 100%%);
color: white;
}
.container {
max-width: 400px;
margin: 0 auto;
background: rgba(255,255,255,0.1);
padding: 30px;
border-radius: 10px;
}
.spinner {
border: 4px solid rgba(255,255,255,0.3);
border-top: 4px solid white;
border-radius: 50%%;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
margin: 20px auto;
}
@keyframes spin { 0%% { transform: rotate(0deg); } 100%% { transform: rotate(360deg); } }
a { color: #ffeb3b; text-decoration: none; }
</style>
</head>
<body>
<div class="container">
<h2>🔐 Authentification réussie</h2>
<div class="spinner"></div>
<p>Redirection vers l'application UnionFlow...</p>
<p><small>Si la redirection ne fonctionne pas automatiquement,
<a href="%s">cliquez ici</a></small></p>
</div>
<script>
// Tentative de redirection automatique
setTimeout(function() {
window.location.href = '%s';
}, 2000);
// Fallback: ouvrir l'app mobile si possible
setTimeout(function() {
try {
window.open('%s', '_self');
} catch(e) {
console.log('Redirection manuelle nécessaire');
}
}, 3000);
</script>
</body>
</html>
"""
.formatted(redirectUrl, redirectUrl, redirectUrl);
return Response.ok(html).type("text/html").build();
} catch (Exception e) {
// En cas d'erreur, retourner une page d'erreur simple
String errorHtml =
"""
<!DOCTYPE html>
<html>
<head><title>Erreur d'authentification</title></head>
<body style="font-family: Arial; text-align: center; padding: 50px;">
<h2>❌ Erreur d'authentification</h2>
<p>Une erreur s'est produite lors de la redirection.</p>
<p>Veuillez fermer cette page et réessayer.</p>
</body>
</html>
""";
return Response.status(500).entity(errorHtml).type("text/html").build();
}
}
}