285 lines
7.9 KiB
Markdown
285 lines
7.9 KiB
Markdown
# Clerk Üyelikleri Database'de Görünmüyor - Kesin Çözüm
|
||
|
||
## ✅ Durum Tespiti
|
||
|
||
**Clerk Yapılandırması**: ✅ AKTIF
|
||
- `clerk_publishable_key` database'de mevcut
|
||
- Değer: `pk_test_Z2FtZS1haXJlZGFsZS05Ni5jbGVyay5hY2NvdW50cy5kZXYk`
|
||
|
||
**Mevcut Profiller**: 2 adet
|
||
- 1 admin (Clerk ID var)
|
||
- 1 admin (Clerk ID yok)
|
||
|
||
## 🔍 Sorunun Gerçek Nedeni
|
||
|
||
Clerk yapılandırması aktif ANCAK kullanıcılar database'de görünmüyor çünkü:
|
||
|
||
### Neden 1: Kullanıcılar Kayıt Olduktan Sonra Giriş Yapmıyor
|
||
- Clerk'te kayıt olan kullanıcılar **mutlaka giriş yapmalı**
|
||
- Profile oluşturma işlemi **ilk giriş sırasında** gerçekleşir
|
||
- Webhook yapılandırılmamışsa, kayıt anında profile oluşmaz
|
||
|
||
### Neden 2: Email Doğrulama Tamamlanmıyor
|
||
- Clerk email doğrulama gerektiriyorsa, kullanıcılar doğrulama yapmadan giriş yapamaz
|
||
- Doğrulama yapılmadan profile oluşmaz
|
||
|
||
### Neden 3: Hata Oluşuyor Ama Görünmüyor
|
||
- Profile oluşturma sırasında hata olabilir
|
||
- Kullanıcı giriş yapmış gibi görünür ama profile oluşmamıştır
|
||
|
||
## 🛠️ Kesin Çözüm
|
||
|
||
### Çözüm 1: Webhook Yapılandırması (ÖNERİLEN)
|
||
|
||
Webhook yapılandırıldığında, kullanıcılar **kayıt anında** database'e eklenir.
|
||
|
||
#### Adım 1: Clerk Webhook Oluşturun
|
||
1. [Clerk Dashboard](https://dashboard.clerk.com) → Webhooks
|
||
2. "Add Endpoint" butonuna tıklayın
|
||
3. Endpoint URL:
|
||
```
|
||
https://pkycoiknpdwzkarqelai.supabase.co/functions/v1/clerk-webhook
|
||
```
|
||
4. Events seçin:
|
||
- ✅ `user.created`
|
||
- ✅ `user.updated`
|
||
- ✅ `user.deleted`
|
||
5. "Create" butonuna tıklayın
|
||
6. **Signing Secret**'i kopyalayın (örn: `whsec_xxxxx`)
|
||
|
||
#### Adım 2: Webhook Secret'i Supabase'e Ekleyin
|
||
1. [Supabase Dashboard](https://supabase.com/dashboard/project/pkycoiknpdwzkarqelai)
|
||
2. Settings → Edge Functions → Secrets
|
||
3. "Add Secret":
|
||
- Name: `CLERK_WEBHOOK_SECRET`
|
||
- Value: (Clerk'ten kopyaladığınız secret)
|
||
4. "Save"
|
||
|
||
#### Adım 3: Test Edin
|
||
1. Clerk'te yeni bir test kullanıcısı oluşturun
|
||
2. Hemen database'i kontrol edin:
|
||
```sql
|
||
SELECT id, email, username, role, clerk_user_id, created_at
|
||
FROM profiles
|
||
ORDER BY created_at DESC
|
||
LIMIT 5;
|
||
```
|
||
3. Yeni profile görünmelidir ✅
|
||
|
||
### Çözüm 2: Mevcut Kullanıcıları Senkronize Edin
|
||
|
||
Eğer Clerk'te kullanıcılar var ama database'de yoksa:
|
||
|
||
#### Manuel Senkronizasyon
|
||
1. Her kullanıcının **en az bir kez giriş yapması** gerekir
|
||
2. Giriş yaptıklarında otomatik olarak profile oluşur
|
||
|
||
#### Toplu Senkronizasyon (Admin)
|
||
Admin olarak giriş yapın ve aşağıdaki script'i çalıştırın:
|
||
|
||
```typescript
|
||
// Browser console'da çalıştırın
|
||
async function syncClerkUsers() {
|
||
const response = await fetch('https://api.clerk.com/v1/users', {
|
||
headers: {
|
||
'Authorization': 'Bearer YOUR_CLERK_SECRET_KEY',
|
||
'Content-Type': 'application/json'
|
||
}
|
||
});
|
||
|
||
const users = await response.json();
|
||
|
||
for (const user of users) {
|
||
const email = user.email_addresses[0]?.email_address;
|
||
if (!email) continue;
|
||
|
||
// Check if profile exists
|
||
const { data: existing } = await supabase
|
||
.from('profiles')
|
||
.select('id')
|
||
.eq('clerk_user_id', user.id)
|
||
.maybeSingle();
|
||
|
||
if (!existing) {
|
||
// Create profile
|
||
await supabase.from('profiles').insert({
|
||
clerk_user_id: user.id,
|
||
email: email,
|
||
username: user.username || email.split('@')[0],
|
||
full_name: `${user.first_name || ''} ${user.last_name || ''}`.trim(),
|
||
avatar_url: user.image_url,
|
||
role: 'user',
|
||
is_active: true
|
||
});
|
||
console.log('✅ Created profile for:', email);
|
||
}
|
||
}
|
||
}
|
||
|
||
syncClerkUsers();
|
||
```
|
||
|
||
### Çözüm 3: Email Doğrulama Ayarlarını Kontrol Edin
|
||
|
||
1. [Clerk Dashboard](https://dashboard.clerk.com) → User & Authentication → Email, Phone, Username
|
||
2. Email ayarlarını kontrol edin:
|
||
- "Require email verification" kapalı olmalı (test için)
|
||
- Veya kullanıcılar email doğrulamasını tamamlamalı
|
||
|
||
### Çözüm 4: Hata Loglarını Kontrol Edin
|
||
|
||
#### Browser Console
|
||
1. Uygulamayı açın
|
||
2. F12 → Console
|
||
3. Yeni kullanıcı kaydı yapın
|
||
4. Hata mesajlarını arayın:
|
||
```
|
||
❌ Error creating profile in useAuth
|
||
❌ Profile creation failed
|
||
```
|
||
|
||
#### Supabase Logs
|
||
1. [Supabase Dashboard](https://supabase.com/dashboard/project/pkycoiknpdwzkarqelai)
|
||
2. Logs → Edge Functions
|
||
3. `clerk-webhook` fonksiyonunu seçin
|
||
4. Son hataları kontrol edin
|
||
|
||
## 📊 Test Senaryoları
|
||
|
||
### Test 1: Yeni Kullanıcı Kaydı (Webhook Var)
|
||
```
|
||
1. Clerk'te kayıt ol
|
||
↓
|
||
2. Webhook tetiklenir
|
||
↓
|
||
3. clerk-webhook edge function çalışır
|
||
↓
|
||
4. Profile database'e eklenir ✅
|
||
↓
|
||
5. Kullanıcı giriş yapar
|
||
↓
|
||
6. Profile bulunur ✅
|
||
```
|
||
|
||
### Test 2: Yeni Kullanıcı Kaydı (Webhook Yok)
|
||
```
|
||
1. Clerk'te kayıt ol
|
||
↓
|
||
2. Email doğrulama (varsa)
|
||
↓
|
||
3. Giriş yap
|
||
↓
|
||
4. useClerkAuthImplementation hook çalışır
|
||
↓
|
||
5. Profile oluşturulur ✅
|
||
```
|
||
|
||
### Test 3: Mevcut Kullanıcı Girişi
|
||
```
|
||
1. Clerk'te kayıtlı kullanıcı giriş yapar
|
||
↓
|
||
2. useClerkAuthImplementation hook çalışır
|
||
↓
|
||
3. Clerk ID ile profile aranır
|
||
↓
|
||
4. Bulunamazsa email ile aranır
|
||
↓
|
||
5. Bulunamazsa yeni profile oluşturulur ✅
|
||
```
|
||
|
||
## 🔧 Troubleshooting Komutları
|
||
|
||
### Database'de Clerk Kullanıcılarını Kontrol Et
|
||
```sql
|
||
-- Tüm Clerk kullanıcıları
|
||
SELECT id, email, username, role, clerk_user_id, created_at
|
||
FROM profiles
|
||
WHERE clerk_user_id IS NOT NULL
|
||
ORDER BY created_at DESC;
|
||
|
||
-- Son 24 saatte oluşturulan profiller
|
||
SELECT id, email, username, role, clerk_user_id, created_at
|
||
FROM profiles
|
||
WHERE created_at > NOW() - INTERVAL '24 hours'
|
||
ORDER BY created_at DESC;
|
||
|
||
-- Clerk ID'si olmayan profiller
|
||
SELECT id, email, username, role, created_at
|
||
FROM profiles
|
||
WHERE clerk_user_id IS NULL
|
||
ORDER BY created_at DESC;
|
||
```
|
||
|
||
### Webhook Loglarını Kontrol Et
|
||
```sql
|
||
-- Supabase Dashboard → Logs → Edge Functions → clerk-webhook
|
||
-- Son 100 log kaydını görüntüle
|
||
```
|
||
|
||
### Profile Oluşturma Hatalarını Kontrol Et
|
||
```javascript
|
||
// Browser console'da
|
||
localStorage.getItem('supabase.auth.token')
|
||
// Token varsa kullanıcı giriş yapmış
|
||
```
|
||
|
||
## 📝 Sonuç ve Öneriler
|
||
|
||
### Hemen Yapılması Gerekenler
|
||
1. ✅ **Webhook yapılandırın** (5 dakika)
|
||
2. ✅ **Test kullanıcısı oluşturun** (2 dakika)
|
||
3. ✅ **Database'i kontrol edin** (1 dakika)
|
||
|
||
### Uzun Vadeli Öneriler
|
||
1. ✅ Email doğrulama ayarlarını optimize edin
|
||
2. ✅ Hata loglarını düzenli kontrol edin
|
||
3. ✅ Kullanıcı onboarding sürecini iyileştirin
|
||
4. ✅ Webhook monitoring ekleyin
|
||
|
||
### Beklenen Sonuç
|
||
Webhook yapılandırıldıktan sonra:
|
||
- ✅ Yeni kullanıcılar **kayıt anında** database'e eklenir
|
||
- ✅ Giriş yapmadan önce profil oluşur
|
||
- ✅ Admin panelinde hemen görünür
|
||
- ✅ Provider kaydı sorunsuz çalışır
|
||
|
||
## 🆘 Hala Çalışmıyor mu?
|
||
|
||
Eğer webhook yapılandırdıktan sonra hala çalışmıyorsa:
|
||
|
||
1. **Webhook Secret'i kontrol edin**:
|
||
```bash
|
||
# Supabase Dashboard → Settings → Edge Functions → Secrets
|
||
# CLERK_WEBHOOK_SECRET var mı?
|
||
```
|
||
|
||
2. **Endpoint URL'i kontrol edin**:
|
||
```
|
||
https://pkycoiknpdwzkarqelai.supabase.co/functions/v1/clerk-webhook
|
||
```
|
||
|
||
3. **Clerk Dashboard'da webhook durumunu kontrol edin**:
|
||
- Webhooks → Your endpoint → Recent deliveries
|
||
- Başarılı mı? (200 OK)
|
||
- Hata var mı? (4xx, 5xx)
|
||
|
||
4. **Edge function loglarını kontrol edin**:
|
||
- Supabase Dashboard → Logs → Edge Functions
|
||
- clerk-webhook fonksiyonunu seçin
|
||
- Hata mesajlarını okuyun
|
||
|
||
5. **Manuel test yapın**:
|
||
```bash
|
||
curl -X POST https://pkycoiknpdwzkarqelai.supabase.co/functions/v1/clerk-webhook \
|
||
-H "Content-Type: application/json" \
|
||
-H "svix-id: test" \
|
||
-H "svix-timestamp: $(date +%s)" \
|
||
-H "svix-signature: test" \
|
||
-d '{"type":"user.created","data":{"id":"test_user","email_addresses":[{"email_address":"test@example.com"}],"username":"testuser","first_name":"Test","last_name":"User"}}'
|
||
```
|
||
|
||
Eğer hala sorun devam ediyorsa, lütfen şu bilgileri paylaşın:
|
||
- Browser console hata mesajları
|
||
- Supabase edge function logları
|
||
- Clerk webhook delivery logları
|