SMS-OTP · ters yön doğrulama

Tek kullanımlık şifreyi tersine çevirdik.

Şifresiz giriş, aynı güvenlik seviyesi — daha az kağıt işi, çok daha uygun fiyat.

Dışarıya SMS göndermediğimiz için throttle darboğazı yok — istediğiniz hızda, istediğiniz kadar müşteriyi daha hızlı doğrulayıp kayıt altına alın.

İlk 250 başarılı doğrulama ücretsiz — kredi kartı gerekmez.

Klasik tek kullanımlık şifrede (OTP) kodu biz kullanıcıya yollarız, kullanıcı da onu ekrana yazar — oysa yazılan bir kod paylaşılabilir, yönlendirilebilir, kandırılabilir. Biz yönü tersine çevirdik: kodu sizin ekranınızda gösteriyoruz, kullanıcı onu kendi telefonundan kısa numaramıza SMS olarak gönderiyor. Doğrulama, mesaj gerçekten o telefondan çıkmadan kabul edilmiyor — asıl güvenlik tam burada. Taşıyıcı göndericinin o numara olduğuna şahitlik ediyor, biz oturumu eşleştirip uygulamanıza HMAC-SHA256 imzalı bir verified webhook'u atıyoruz.

Kendiniz deneyin ve görün

Aşağıdaki kodu gösterilen numaraya SMS atmak için SMS gönder butonuna basın.

Canlı oturum sess_…
··········
Telefonundan ···· ······ yazıp 0216 606 22 05 numarasına gönder.
Bu kod yalnızca bu oturuma özeldir ve sadece bu ekranda size gösterilir — başka kimse görmez, paylaşmanıza gerek yok.
— sn
Doğrulandı · taşıyıcı onaylı

Bu numara sizsin.

+90 ··· ··· ·· ··

Mobil ağ, SMS'in bu numaradan geldiğine şahitlik etti. Tarayıcı kaynaklı hiçbir alan bu zincirde yer almadı. Bu numara yalnızca bu oturumda, yalnızca bu ekranda gösteriliyor — herkese açık değil.

Süre doldu

60 saniye içinde eşleşen bir SMS ulaşmadı. Yeni bir kod alıp tekrar deneyebilirsin.

Oturum açılamadı

Bağlantıda bir sorun oluştu.

Dört adım. SMS'in kendisi kanıttır.

Form tabanlı OTP'lerde kullanıcı kodu okur ve yazar. Biz işin yönünü çeviriyoruz — taşıyıcı doğrudan kim olduklarına şahitlik ediyor.

01
Webapp

Oturumu başlat

POST /auth/init. Yanıt: 4 harfli prefix + 6 haneli OTP + 60 sn ömürlü oturum kimliği.

02
Son kullanıcı

SMS ile cevap

Ekrandaki WXKZ 482910 kombinasyonunu kısa numaraya yollar — bu işlem onun ispatıdır.

03
Gateway

Inbound webhook

GSM operatörü (veya seçtiğiniz sağlayıcı) bize POST eder. Prefix + OTP eşleşirse oturum kapanır.

04
Backend'iniz

İmzalı geri çağrı

callback_url'nize verified veya timeout — her zaman imzalı.

Tarayıcıdan taklit edilemeyen şeyler için.

Sahiplik ispatı

SMS'in göndericisi mobil ağ tarafından belirlenir — formdan değil. Tarayıcı kaynaklı hiçbir bilgi güvenilmez. Bu, telefon numarası doğrulamasını yapısal olarak sahteciliğe kapatır.

Sert 60 saniye

Her oturum için bir Durable Object çalışır ve 60 saniyelik bir alarm kurar. Süre dolduğunda doğrulama sunucu tarafında biter — clock drift, polling veya açık kalmış oturum yok.

İmzalı geri çağrı

Backend'iniz hiçbir form alanına güvenmez. Sadece X-Login-Signature başlığını webapp'a özel HMAC secret'la doğrular — gövdeyi biz attest ediyoruz.

Telefon doğrulaması ancak sahte üretilemediğinde işe yarar. Bu yüzden tarayıcının söylediği hiçbir şeye değil, taşıyıcının ettiği şahitliğe güveniyoruz.
— Tasarım ilkesi · 01

Aynı backend. Üç inbound yöntemi.

Operatör webapp'ı oluştururken hangisinin kullanılacağını seçer. Sonradan değiştirmek bir tıklama.

Paylaşımlı

Operatörün GSM numarası

4 harfli prefix tüm webapp'ları aynı kısa numarada toplar.

Kullanıcı <prefix> <otp> yazar. Toplam 11 karakter.
En ucuz5 dakika kurulum
Özel

Kendi GSM numaranız

Numara doğrudan webapp'ınıza bağlı, prefix gerekmez.

Sadece 6 haneli OTP — daha kısa ve net.
Aylık abonelik1 gün kurulum
BYO Gateway

Kendi SMS sağlayıcınız

Twilio, Vonage veya self-hosted SMSC'i webapp'a özel inbound URL'e bağlayın.

Esnek — kendi markanızla kendi kısa numaranız.
Sağlayıcı maliyeti30 dk kurulum

İki HTTP çağrısı. O kadar.

Bir uca /auth/init'i çağırıyorsunuz, diğer uçta bizden imzalı bir POST bekliyorsunuz.

01 İstek

OTP başlat

→ otp.mioe.com.tr/auth/init
POST /auth/init HTTP/1.1
Host: otp.mioe.com.tr
X-API-Key: lvsr_a3f…b21
Content-Type: application/json

{ "phone": "+905321112233" }
Yanıtta sessionId, code (prefix), otp ve dedicated modda inboundNumber döner.
02 Geri çağrı

İmzalı POST'u doğrulayın

→ yourapp.example/sms-login/cb
POST /sms-login/cb HTTP/1.1
X-Login-Signature: t=1746635012,v1=8c5d…
Content-Type: application/json

{
  "type": "verified",
  "sessionId": "1cce6791…",
  "phone": "+905321112233",
  "verifiedAt": "2026-05-07T16:00:42Z"
}
v1 == HMAC_SHA256(secret, t + "." + rawBody) — sabit zamanlı kıyaslama şart.

QR kodu + SMS butonu: en iyi kullanıcı deneyimi.

Kullanıcıya OTP kodunu gösterdikten sonra SMS göndermeyi kolaylaştırmanın en iyi yolu masaüstünde QR kodu, mobilde SMS butonu sunmaktır. Yukarıdaki canlı demo da bu yaklaşımı kullanır.

QR kodu (masaüstü)

Masaüstü tarayıcılarda kullanıcı telefonuyla QR kodu okutarak SMS uygulamasını numara ve mesaj doldurulmuş halde açar. Tek adımda göndermeye hazır.

SMS butonu (mobil)

Mobil cihazlarda <a href="sms:…"> bağlantısı telefonun SMS uygulamasını doğrudan açar. Kullanıcı sadece "Gönder"e basar.

Android QR çözümü

Android kamera uygulamaları sms: protokolünü doğrudan açamaz. QR'a HTTPS yönlendirme linki koyun; sayfa açılınca sms:'e yönlendirir.

SMS URI

sms: şeması

Mobilde SMS butonunun bağlantısı
// SMS URI formatı:
sms:+90XXXXXXXXXX?body=WXKZ%20482910

// HTML'de kullanımı:
<a href="sms:+90..?body=WXKZ%20482910">
  SMS gönder
</a>

// JS ile oluşturmak:
var smsUri = 'sms:' + number
  + '?body=' + encodeURIComponent(
    code + ' ' + otp
  );
?body= veya ?&body= — iOS ve Android'in her ikisi de bu formatı kabul eder.
Android QR

Yönlendirme sayfası

→ yourapp.example/sms-redirect
// QR içine konan URL (sms: değil!):
https://yourapp.example/sms-redirect
  ?to=+90XXXXXXXXXX&body=WXKZ%20482910

// Yönlendirme sayfasının JS'i:
var p = new URLSearchParams(location.search);
var uri = 'sms:'
  + encodeURIComponent(p.get('to'))
  + '?body='
  + encodeURIComponent(p.get('body'));
// Otomatik yönlendir:
window.location.href = uri;
Android kamera → HTTPS sayfası → sms: URI → SMS uygulaması açılır.
01

Mobil tespit

navigator.userAgent ile mobil/masaüstü ayırın. Mobilde SMS butonu, masaüstünde QR gösterin.

02

QR'da HTTPS kullanın

QR kodu içine sms: URI'si değil, kendi sitenizde bir HTTPS yönlendirme sayfası URL'i koyun. Android kamera uygulamaları sms: protokolünü tanımaz.

03

API key'i frontend'e koymayın

/auth/init çağrısını backend proxy'niz üzerinden yapın. API anahtarı yalnızca sunucu tarafında kalmalıdır.

04

Durum takibi

OTP gösterildikten sonra sessionId ile backend'inize polling veya SSE/WebSocket ile doğrulama sonucunu dinleyin.

Tek güvendiğimiz şey: sizin secret'ınızla imzalanmış baytlar.

01

Taşıyıcı onaylı gönderici

Inbound SMS'in göndericisi mobil ağ tarafından set edilir. Tarayıcı kaynaklı hiçbir alan bu zincirde yer almaz.

02

HMAC-SHA256 imzalı geri çağrı

Her webhook X-Login-Signature taşır. Backend, ham gövdeyi sizin secret'ınızla doğrulayana kadar olayı varsaymaz.

03

Webapp-başına izolasyon

API key, HMAC secret, prefix ve callback URL tek bir kiracıya bağlıdır. Çapraz eşleşme yapısal olarak imkânsız.

04

Replay'e dayanıklı

İmza Unix zaman damgasına bağlanır; ±5 dakika pencere önerilir. Her OTP tek seferliktir, eşleştiği an ölür.

05

Sert 60 saniye

Durable Object alarmı süreyi sunucu tarafında zorlar. Kullanıcı tarafında hiçbir hile süreyi uzatamaz.

06

Re-issue eskiyi öldürür

Aynı telefon için yeni /auth/init önceki oturumu sessizce failed olarak işaretler — eski kod anında işe yaramaz.

07

Sabit zamanlı doğrulama

Her dilde örnek kod timingSafeEqual / hash_equals kullanır — kendiniz == ile karşılaştırmayın.

08

Sırlar bir kez gösterilir

API key ve HMAC secret yalnızca oluşturma veya rotation anında görünür. Sızdığında operatör yerinde rotate edebilir.

Parolalar OWASP standardında saklanır.

Tüm hesap parolaları endüstri standardı Argon2id ile özetlenir — OWASP Parola Saklama kılavuzunun asgari profilini birebir karşılar. Hiçbir parola düz metin ya da geri çevrilebilir biçimde tutulmaz.

OWASP uyumlu Argon2id

Parolalar Argon2id ile özetlenir: m=19 MiB · t=2 · p=1 — OWASP 2023 asgari profili. Hafıza-zorlu (memory-hard) tasarım, çalınan bir veritabanını GPU/ASIC ile toplu kırmayı ekonomik olmaktan çıkarır.

Geri döndürülemez, tuzlu

Her parola için 16 baytlık benzersiz, CSPRNG üretimi tuz kullanılır; aynı parolalar bile farklı özetlere düşer. Doğrulama sabit zamanlı yapılır — zamanlama yan kanalı yok.

Kendini güncelleyen

Maliyet parametreleri özetin içine gömülüdür. Standart yükseldiğinde eşiği artırmanız yeterli; mevcut kayıtlar bir sonraki girişte sessizce yeni profile yükseltilir — kimse kilitlenmez, parola sıfırlaması gerekmez.

Kriptografik temeller

Kimlik doğrulama katmanının tamamı tek bir denetlenebilir kripto modülü üzerine kuruludur.

01

Argon2id parola özetleme

OWASP parametreleriyle; PHC formatında, parametreler özetle birlikte saklanır.

02

HMAC-SHA256 imzalama

İmzalı webhook geri çağrıları aynı modülde üretilir ve sabit zamanlı doğrulanır.

03

SHA-256 token özeti

Oturum ve parola sıfırlama token'ları veritabanında yalnızca hash'lenmiş halde tutulur.

04

Kriptografik rastgelelik

OTP'ler, tuzlar ve token'lar crypto.getRandomValues CSPRNG ile üretilir.

05

Sabit zamanlı kıyas

timingSafeEqual ile parola ve imza karşılaştırmalarında zamanlama sızıntısı yok.

06

Bias'sız OTP

Reddetme örneklemesiyle (rejection sampling) üretilen kodlarda modulo yanlılığı bulunmaz.

Abonelik yok. Kullandığın kadar kredi.

İlk 250 doğrulama ücretsiz. Sonrasında ihtiyacınız kadar kredi alırsınız; her başarılı doğrulama yalnızca 1 kredidir. Kredi başı 0,03 TL (KDV hariç); aşağıdaki tutarlara KDV dahildir.

1.000 kredi
36 TL
KDV dahil
5.000 kredi
180 TL
KDV dahil
25.000 kredi
900 TL
KDV dahil
100.000 kredi
3.600 TL
KDV dahil

Bir akşamda bağlayın.

SaaS'ınız zaten bir form-OTP akışına sahipse, geçişi ortalama 90 dakikada tamamlıyorsunuz. İlk 250 başarılı doğrulama ücretsiz; kredi kartı gerekmez.