102 lines
3.7 KiB
JavaScript
102 lines
3.7 KiB
JavaScript
let googleInitialized = false;
|
|
|
|
window.initGoogleSignIn = function(clientId) {
|
|
if (googleInitialized) {
|
|
console.log("Google Sign-In already initialized");
|
|
return;
|
|
}
|
|
|
|
console.log("🔐 Initializing Google Sign-In (ID Token flow)");
|
|
console.log("📋 Received clientId:", clientId);
|
|
console.log("📋 ClientId type:", typeof clientId);
|
|
console.log("📋 ClientId length:", clientId ? clientId.length : 0);
|
|
|
|
if (!clientId || clientId === '' || clientId === 'null' || clientId === 'undefined') {
|
|
console.error("❌ Invalid clientId received:", clientId);
|
|
throw new Error("ClientId is null, empty, or invalid");
|
|
}
|
|
|
|
// Check if Google library is loaded
|
|
if (typeof google === 'undefined' || !google.accounts || !google.accounts.id) {
|
|
console.error("❌ Google Sign-In library not loaded yet!");
|
|
throw new Error("Google Sign-In library not ready");
|
|
}
|
|
|
|
google.accounts.id.initialize({
|
|
client_id: clientId,
|
|
callback: handleCredentialResponse,
|
|
auto_select: false,
|
|
cancel_on_tap_outside: true
|
|
});
|
|
|
|
googleInitialized = true;
|
|
console.log("✅ Google Sign-In initialized successfully");
|
|
};
|
|
|
|
window.requestGoogleSignIn = function() {
|
|
console.log("🚀 Requesting Google Sign-In...");
|
|
|
|
google.accounts.id.prompt();
|
|
};
|
|
|
|
function handleCredentialResponse(response) {
|
|
console.log("=== 🎉 Google Credential Response ===");
|
|
|
|
try {
|
|
if (!response.credential) {
|
|
throw new Error("No credential in response");
|
|
}
|
|
|
|
const tokenParts = response.credential.split('.');
|
|
console.log("📝 ID Token parts:", tokenParts.length); // Should be 3 (JWT)
|
|
console.log("📏 ID Token length:", response.credential.length);
|
|
|
|
if (tokenParts.length !== 3) {
|
|
throw new Error("Invalid JWT format - expected 3 parts (header.payload.signature)");
|
|
}
|
|
|
|
// Dekoduj payload JWT aby wyciągnąć user info
|
|
const payload = decodeJwtPayload(response.credential);
|
|
|
|
const fullName = payload.name || `${payload.given_name || ''} ${payload.family_name || ''}`.trim();
|
|
const email = payload.email;
|
|
const avatarUrl = payload.picture || '';
|
|
|
|
console.log("👤 User info from JWT:", { fullName, email });
|
|
console.log("📧 Email verified:", payload.email_verified);
|
|
|
|
// Wywołaj Blazor - przekaż ID token JWT (nie access token!)
|
|
DotNet.invokeMethodAsync('DiunaBI.UI.Shared', 'OnGoogleSignInSuccess',
|
|
response.credential, // <--- To jest ID token JWT dla backendu
|
|
fullName,
|
|
email,
|
|
avatarUrl)
|
|
.then(() => {
|
|
console.log("✅ Successfully sent ID token to Blazor");
|
|
})
|
|
.catch(err => {
|
|
console.error("❌ Error calling Blazor:", err);
|
|
DotNet.invokeMethodAsync('DiunaBI.UI.Shared', 'OnGoogleSignInError', err.toString());
|
|
});
|
|
} catch (error) {
|
|
console.error("❌ Error processing Google credential:", error);
|
|
DotNet.invokeMethodAsync('DiunaBI.UI.Shared', 'OnGoogleSignInError', error.toString());
|
|
}
|
|
}
|
|
|
|
function decodeJwtPayload(token) {
|
|
try {
|
|
const base64Url = token.split('.')[1];
|
|
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
|
|
const jsonPayload = decodeURIComponent(
|
|
atob(base64)
|
|
.split('')
|
|
.map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
|
|
.join('')
|
|
);
|
|
return JSON.parse(jsonPayload);
|
|
} catch (error) {
|
|
console.error("Error decoding JWT:", error);
|
|
throw new Error("Invalid JWT format");
|
|
}
|
|
} |