"Enter"a basıp içeriğe geçin

Geliştiriciler İçin SMS API Rehberi: Uygulamanıza SMS Doğrulama Entegre Edin

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

  1. Rate Limiting: IP başına dakikada maksimum 3-5 istek
  2. OTP Süresi: Maksimum 5-10 dakika geçerlilik
  3. Deneme Limiti: 3 yanlış denemeden sonra yeni kod gereksin
  4. Telefon Formatı Validasyonu: E.164 formatını zorunlu tutun
  5. API Key Güvenliği: Environment variable kullanın, koda gömmeyin
  6. HTTPS Zorunluluğu: Tüm API trafiği şifreli olmalı
  7. 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:

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir