Fix Discord OAuth data format

This commit is contained in:
gpt-engineer-app[bot]
2025-10-12 00:43:58 +00:00
parent 721fe82a00
commit cf94eef683

View File

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