mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-21 10:51:13 -05:00
Fix Discord OAuth data format
This commit is contained in:
@@ -29,14 +29,18 @@ interface GoogleUserMetadata {
|
|||||||
|
|
||||||
interface DiscordUserMetadata {
|
interface DiscordUserMetadata {
|
||||||
email?: string;
|
email?: string;
|
||||||
username?: string;
|
name?: string; // "username#0" format
|
||||||
global_name?: string;
|
full_name?: string; // "username" without discriminator
|
||||||
discriminator?: string;
|
custom_claims?: {
|
||||||
avatar?: string;
|
global_name?: string; // Display name like "PacNPal"
|
||||||
id?: string;
|
};
|
||||||
verified?: boolean;
|
avatar_url?: string; // Full CDN URL
|
||||||
flags?: number;
|
picture?: string; // Alternative full CDN URL
|
||||||
premium_type?: number;
|
provider_id?: string; // Discord user ID
|
||||||
|
sub?: string; // Alternative Discord user ID
|
||||||
|
email_verified?: boolean;
|
||||||
|
phone_verified?: boolean;
|
||||||
|
iss?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
Deno.serve(async (req) => {
|
Deno.serve(async (req) => {
|
||||||
@@ -80,17 +84,12 @@ Deno.serve(async (req) => {
|
|||||||
if (discordIdentity) {
|
if (discordIdentity) {
|
||||||
userMetadata = discordIdentity.identity_data || {};
|
userMetadata = discordIdentity.identity_data || {};
|
||||||
|
|
||||||
// Debug: Log full identity_data to see what Discord actually returns
|
console.log('[OAuth Profile] Discord identity_data:', {
|
||||||
console.log('[OAuth Profile] Discord identity_data (full):', JSON.stringify(discordIdentity.identity_data));
|
hasAvatarUrl: !!(userMetadata as DiscordUserMetadata).avatar_url,
|
||||||
|
hasFullName: !!(userMetadata as DiscordUserMetadata).full_name,
|
||||||
console.log('[OAuth Profile] Using Discord identity data:', {
|
hasGlobalName: !!(userMetadata as DiscordUserMetadata).custom_claims?.global_name,
|
||||||
hasAvatar: !!userMetadata.avatar,
|
hasProviderId: !!(userMetadata as DiscordUserMetadata).provider_id,
|
||||||
hasUsername: !!userMetadata.username,
|
hasEmail: !!(userMetadata as DiscordUserMetadata).email
|
||||||
hasGlobalName: !!userMetadata.global_name,
|
|
||||||
hasId: !!userMetadata.id,
|
|
||||||
hasEmail: !!userMetadata.email,
|
|
||||||
avatarValue: userMetadata.avatar,
|
|
||||||
idValue: userMetadata.id
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.warn('[OAuth Profile] Discord provider found but no Discord identity in user.identities');
|
console.warn('[OAuth Profile] Discord provider found but no Discord identity in user.identities');
|
||||||
@@ -111,43 +110,39 @@ Deno.serve(async (req) => {
|
|||||||
} else if (provider === 'discord') {
|
} else if (provider === 'discord') {
|
||||||
const discordData = userMetadata as DiscordUserMetadata;
|
const discordData = userMetadata as DiscordUserMetadata;
|
||||||
|
|
||||||
// Prefer global_name, fall back to username
|
// Extract Discord user ID from provider_id or sub
|
||||||
displayName = discordData.global_name || discordData.username || null;
|
const discordId = discordData.provider_id || discordData.sub || null;
|
||||||
usernameBase = discordData.username || null;
|
|
||||||
|
|
||||||
// Extract email (Discord provides it with email scope)
|
// Extract display name: custom_claims.global_name > full_name > name
|
||||||
|
displayName = discordData.custom_claims?.global_name || discordData.full_name || discordData.name || null;
|
||||||
|
|
||||||
|
// Extract username base: full_name or name without discriminator
|
||||||
|
usernameBase = discordData.full_name || discordData.name?.split('#')[0] || null;
|
||||||
|
|
||||||
|
// Extract email
|
||||||
const discordEmail = discordData.email || null;
|
const discordEmail = discordData.email || null;
|
||||||
|
|
||||||
// Validate we have minimum required data
|
// Use the avatar URL that Supabase already provides (full CDN URL)
|
||||||
if (!discordData.id) {
|
avatarUrl = discordData.avatar_url || discordData.picture || null;
|
||||||
console.error('[OAuth Profile] Discord user ID missing - OAuth scopes may not be configured correctly');
|
|
||||||
|
// Validation logging
|
||||||
|
if (!discordId) {
|
||||||
|
console.error('[OAuth Profile] Discord user ID missing from provider_id/sub - OAuth data incomplete');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!discordData.username) {
|
if (!usernameBase) {
|
||||||
console.warn('[OAuth Profile] Discord username missing - using ID as fallback');
|
console.warn('[OAuth Profile] Discord username missing - using ID as fallback');
|
||||||
usernameBase = discordData.id || null;
|
usernameBase = discordId;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct Discord avatar URL with proper format detection
|
console.log('[OAuth Profile] Discord user (Supabase format):', {
|
||||||
if (discordData.avatar && discordData.id) {
|
|
||||||
// Discord animated avatars have 'a_' prefix and use .gif extension
|
|
||||||
const isAnimated = discordData.avatar.startsWith('a_');
|
|
||||||
const extension = isAnimated ? 'gif' : 'png';
|
|
||||||
avatarUrl = `https://cdn.discordapp.com/avatars/${discordData.id}/${discordData.avatar}.${extension}?size=512`;
|
|
||||||
} else if (!discordData.avatar && discordData.id) {
|
|
||||||
// User has no custom avatar - use Discord default avatar
|
|
||||||
const defaultAvatarIndex = (parseInt(discordData.id) >> 22) % 6;
|
|
||||||
avatarUrl = `https://cdn.discordapp.com/embed/avatars/${defaultAvatarIndex}.png`;
|
|
||||||
console.log('[OAuth Profile] Using Discord default avatar for user without custom avatar');
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[OAuth Profile] Discord user:', {
|
|
||||||
avatarUrl,
|
avatarUrl,
|
||||||
displayName,
|
displayName,
|
||||||
usernameBase,
|
usernameBase,
|
||||||
|
discordId,
|
||||||
email: discordEmail,
|
email: discordEmail,
|
||||||
hasAnimatedAvatar: discordData.avatar?.startsWith('a_'),
|
hasAvatar: !!avatarUrl,
|
||||||
hasCustomAvatar: !!discordData.avatar
|
source: discordData.avatar_url ? 'avatar_url' : discordData.picture ? 'picture' : 'none'
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.log('[OAuth Profile] Unsupported provider:', provider);
|
console.log('[OAuth Profile] Unsupported provider:', provider);
|
||||||
|
|||||||
Reference in New Issue
Block a user