Modern uygulamalarda kullanıcı doğrulama kritik bir güvenlik katmanı. SMS onay sistemleri, OTP (One-Time Password) ile hesap güvenliğini sağlamanın en yaygın yöntemi. Bu rehberde kendi uygulamanıza SMS doğrulama API’si entegre etmenin teknik detaylarını inceleyeceğiz.
SMS API Nedir?
SMS API, uygulamanızın programatik olarak SMS göndermesini ve almasını sağlayan bir arayüzdür. RESTful mimari üzerine kurulu modern API’ler, HTTP istekleriyle kolayca entegre edilebilir. Temel kullanım alanları:
- OTP Doğrulama: Kayıt ve giriş işlemlerinde tek kullanımlık kod gönderimi
- İki Faktörlü Kimlik Doğrulama (2FA): Ekstra güvenlik katmanı
- İşlem Onayı: Ödeme ve kritik işlemlerde doğrulama
- Bildirimler: Sipariş durumu, randevu hatırlatma vb.
API Seçim Kriterleri
Projeniz için SMS API seçerken değerlendirmeniz gereken faktörler:
1. Teknik Özellikler
- RESTful API desteği
- Webhook entegrasyonu
- SDK desteği (Python, Node.js, PHP, Java vb.)
- Detaylı dokümantasyon
- Sandbox/test ortamı
2. Performans
- Ortalama teslim süresi (ideal: <10 saniye)
- Uptime garantisi (%99.9+)
- Rate limiting politikası
- Concurrent request kapasitesi
3. Kapsama ve Fiyatlandırma
- Desteklenen ülke sayısı
- Birim SMS maliyeti
- Kullandıkça öde vs. paket fiyatlandırma
- Hacim indirimleri
Temel API Akışı
Tipik bir SMS doğrulama akışı şu adımlardan oluşur:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Client │────▶│ Server │────▶│ SMS API │
│ (Kullanıcı)│ │ (Backend) │ │ (Provider) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
│ 1. Telefon No │ │
│───────────────────▶│ │
│ │ 2. OTP Oluştur │
│ │ 3. API Request │
│ │───────────────────▶│
│ │ │
│ │◀───────────────────│
│ │ 4. SMS Gönderildi │
│◀───────────────────│ │
│ 5. Kod Gir │ │
│───────────────────▶│ │
│ │ 6. Doğrula │
│◀───────────────────│ │
│ 7. Başarılı/Hata │ │
└────────────────────┴────────────────────┘
Kod Örnekleri
Python ile SMS Gönderimi
import requests
import random
import redis
class SMSVerification:
def __init__(self, api_key, api_url):
self.api_key = api_key
self.api_url = api_url
self.redis = redis.Redis(host='localhost', port=6379, db=0)
def generate_otp(self):
return str(random.randint(100000, 999999))
def send_verification(self, phone_number):
otp = self.generate_otp()
# OTP'yi Redis'e kaydet (5 dakika TTL)
self.redis.setex(f"otp:{phone_number}", 300, otp)
# API isteği
response = requests.post(
self.api_url,
headers={
'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
},
json={
'phone': phone_number,
'message': f'Doğrulama kodunuz: {otp}'
}
)
return response.json()
def verify_otp(self, phone_number, user_otp):
stored_otp = self.redis.get(f"otp:{phone_number}")
if stored_otp and stored_otp.decode() == user_otp:
self.redis.delete(f"otp:{phone_number}")
return True
return False
# Kullanım
sms = SMSVerification('YOUR_API_KEY', 'https://api.smsservice.com/send')
sms.send_verification('+905551234567')
Node.js ile SMS Gönderimi
const axios = require('axios');
const Redis = require('ioredis');
class SMSVerification {
constructor(apiKey, apiUrl) {
this.apiKey = apiKey;
this.apiUrl = apiUrl;
this.redis = new Redis();
}
generateOTP() {
return Math.floor(100000 + Math.random() * 900000).toString();
}
async sendVerification(phoneNumber) {
const otp = this.generateOTP();
// OTP'yi Redis'e kaydet (5 dakika)
await this.redis.setex(`otp:${phoneNumber}`, 300, otp);
try {
const response = await axios.post(this.apiUrl, {
phone: phoneNumber,
message: `Doğrulama kodunuz: ${otp}`
}, {
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
}
});
return { success: true, data: response.data };
} catch (error) {
return { success: false, error: error.message };
}
}
async verifyOTP(phoneNumber, userOTP) {
const storedOTP = await this.redis.get(`otp:${phoneNumber}`);
if (storedOTP === userOTP) {
await this.redis.del(`otp:${phoneNumber}`);
return true;
}
return false;
}
}
module.exports = SMSVerification;
PHP ile SMS Gönderimi
<?php
class SMSVerification {
private $apiKey;
private $apiUrl;
public function __construct($apiKey, $apiUrl) {
$this->apiKey = $apiKey;
$this->apiUrl = $apiUrl;
}
public function generateOTP() {
return str_pad(rand(0, 999999), 6, '0', STR_PAD_LEFT);
}
public function sendVerification($phoneNumber) {
$otp = $this->generateOTP();
// Session'a kaydet
$_SESSION['otp_' . $phoneNumber] = [
'code' => $otp,
'expires' => time() + 300
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $this->apiUrl,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this->apiKey,
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode([
'phone' => $phoneNumber,
'message' => 'Doğrulama kodunuz: ' . $otp
]),
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
public function verifyOTP($phoneNumber, $userOTP) {
$stored = $_SESSION['otp_' . $phoneNumber] ?? null;
if ($stored && $stored['code'] === $userOTP && $stored['expires'] > time()) {
unset($_SESSION['otp_' . $phoneNumber]);
return true;
}
return false;
}
}
?>
Test Ortamı Oluşturma
Geliştirme sürecinde gerçek SMS göndermek hem maliyetli hem de pratik değil. Test için iki yaklaşım kullanabilirsiniz:
1. Mock API
Local geliştirme için sahte API endpoint oluşturun:
# Flask ile basit mock API
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/mock-sms', methods=['POST'])
def mock_sms():
data = request.json
print(f"SMS gönderildi: {data['phone']} - {data['message']}")
return jsonify({'status': 'success', 'message_id': 'mock_123'})
if __name__ == '__main__':
app.run(port=5000)
2. Sanal Numara Servisleri
Gerçek SMS akışını test etmek için sanal numara servisleri kullanabilirsiniz. GetCode gibi platformlar 150+ ülkeden test numarası sağlıyor. Avantajları:
- Gerçek SMS altyapısını test etme imkanı
- Farklı ülke formatlarını deneme
- Kişisel numara kullanmadan test
- Paralel test senaryoları için çoklu numara
Güvenlik Best Practices
- Rate Limiting: IP başına dakikada maksimum 3-5 istek
- OTP Süresi: Maksimum 5-10 dakika geçerlilik
- Deneme Limiti: 3 yanlış denemeden sonra yeni kod gereksin
- Telefon Formatı Validasyonu: E.164 formatını zorunlu tutun
- API Key Güvenliği: Environment variable kullanın, koda gömmeyin
- HTTPS Zorunluluğu: Tüm API trafiği şifreli olmalı
- Loglama: Tüm doğrulama girişimlerini kaydedin
Sonuç
SMS API entegrasyonu, uygulamanızın güvenliğini önemli ölçüde artırır. Doğru API seçimi, güvenli kod pratikleri ve kapsamlı test süreçleriyle sağlam bir doğrulama sistemi kurabilirsiniz. Test aşamasında sanal numara servislerinden faydalanarak hem maliyeti düşürün hem de farklı senaryoları deneyin.
Faydalı Kaynaklar: