Kullanıcılara SMS ile alınan tek kullanımlık şifreler konusunda yardımcı olma
WebOTP API nedir?
Günümüzde dünya üzerindeki çoğu kişinin mobil cihazı var ve geliştiriciler, hizmetlerinin kullanıcılarını tanımlamak için genellikle telefon numaralarını kullanıyor.
Telefon numaralarını doğrulamanın çeşitli yolları vardır ancak en yaygın yöntemlerden biri, SMS ile rastgele oluşturulan tek kullanımlık şifredir (OTP). Bu kodu geliştiricinin sunucusuna geri göndermek, telefon numarasının kontrolünü gösterir.
Bu fikir, aşağıdakileri sağlamak için birçok senaryoda zaten kullanımdadır:
- Kullanıcı için tanımlayıcı olarak telefon numarası. Bazı web siteleri, yeni bir hizmete kaydolurken e-posta adresi yerine telefon numarası ister ve bunu hesap tanımlayıcısı olarak kullanır.
- İki adımlı doğrulama Bir web sitesi, oturum açarken ekstra güvenlik için şifrenin veya diğer bilgi faktörünün yanı sıra SMS ile gönderilen tek kullanımlık bir kod ister.
- Ödeme onayı. Kullanıcı ödeme yaparken SMS ile gönderilen tek kullanımlık bir kod isteğinde bulunmak, kullanıcının niyetini doğrulamaya yardımcı olabilir.
Mevcut süreç, kullanıcılar için sorun oluşturuyor. SMS mesajında bir tek kullanımlık şifre bulup kopyalayıp forma yapıştırmak zahmetli bir işlemdir ve kritik kullanıcı yolculuklarında dönüşüm oranlarını düşürür. Bu işlemi kolaylaştırmak, dünyanın en büyük geliştiricilerinden birçoğunun web için uzun zamandır istediği bir özellikti. Android'de tam olarak bunu yapan bir API vardır. iOS ve Safari de bu konudaki politikalara uymaktadır.
WebOTP API, uygulamanızın alanına bağlı özel olarak biçimlendirilmiş mesajlar almasını sağlar. Bu sayede, SMS mesajından programatik olarak OTP alabilir ve kullanıcının telefon numarasını daha kolay doğrulayabilirsiniz.
İşleyiş şeklini görün
Bir kullanıcının telefon numarasını bir web sitesiyle doğrulamak istediğini varsayalım. Web sitesi, SMS üzerinden kullanıcıya bir kısa mesaj gönderir ve kullanıcı, telefon numarasının sahibi olduğunu doğrulamak için mesajdaki tek kullanımlık şifreyi girer.
WebOTP API ile bu adımlar, videoda gösterildiği gibi kullanıcı için tek bir dokunuş kadar kolaydır. SMS geldiğinde alt tarafta bir sayfa açılır ve kullanıcıdan telefon numarasını doğrulaması istenir. Alttaki sayfada Doğrula düğmesi tıklandıktan sonra tarayıcı, OTP'yi forma yapıştırır ve kullanıcının Devam'a basması gerekmeden form gönderilir.
Sürecin tamamı aşağıdaki resimde şematik olarak gösterilmiştir.
Demoyu kendiniz deneyin. Telefon numaranızı sormaz veya cihazınıza SMS göndermez. Ancak demoda gösterilen metni kopyalayarak başka bir cihazdan SMS gönderebilirsiniz. Bu, WebOTP API'si kullanılırken gönderenin kim olduğu fark etmediği için işe yarar.
- Android cihazda Chrome 84 veya sonraki bir sürümde https://web-otp.glitch.me adresine gidin.
- Başka bir telefondan telefonunuza aşağıdaki SMS kısa mesajını gönderin.
Your OTP is: 123456.
@web-otp.glitch.me #12345
SMS'i aldınız ve giriş alanına kodu girme istemini gördünüz mü? WebOTP API'nin kullanıcılar için işleyiş şekli budur.
WebOTP API'yi kullanma üç bölümden oluşur:
- Doğru şekilde ek açıklama eklenmiş bir
<input>
etiketi - Web uygulamanızda JavaScript
- SMS ile gönderilen biçimlendirilmiş mesaj metni.
Önce <input>
etiketini ele alacağım.
<input>
etiketine not ekleme
WebOTP herhangi bir HTML ek açıklaması olmadan çalışır ancak tarayıcılar arası uyumluluk için kullanıcının OTP girmesini beklediğiniz <input>
etiketine autocomplete="one-time-code"
eklemenizi önemle tavsiye ederiz.
Bu, Safari 14 veya sonraki sürümlerin, WebOTP'yi desteklememesine rağmen SMS mesajını biçimlendirme bölümünde açıklanan biçime sahip bir SMS aldığında kullanıcıya <input>
alanını bir OTP ile otomatik doldurmasını önermesine olanak tanır.
HTML
<form>
<input autocomplete="one-time-code" required/>
<input type="submit">
</form>
WebOTP API'yi kullanma
WebOTP basit olduğu için aşağıdaki kodu kopyalayıp yapıştırmanız yeterlidir. Her halükarda, neler olduğunu size açıklayacağım.
JavaScript
if ('OTPCredential' in window) {
window.addEventListener('DOMContentLoaded', e => {
const input = document.querySelector('input[autocomplete="one-time-code"]');
if (!input) return;
const ac = new AbortController();
const form = input.closest('form');
if (form) {
form.addEventListener('submit', e => {
ac.abort();
});
}
navigator.credentials.get({
otp: { transport:['sms'] },
signal: ac.signal
}).then(otp => {
input.value = otp.code;
if (form) form.submit();
}).catch(err => {
console.log(err);
});
});
}
Özellik algılama
Özellik algılama, diğer birçok API ile aynıdır. DOMContentLoaded
etkinliğini dinlemek, DOM ağacının sorgulamaya hazır olmasını bekler.
JavaScript
if ('OTPCredential' in window) {
window.addEventListener('DOMContentLoaded', e => {
const input = document.querySelector('input[autocomplete="one-time-code"]');
if (!input) return;
…
const form = input.closest('form');
…
});
}
OTP'yi işleme
WebOTP API'nin kendisi oldukça basittir. OTP'yi almak için navigator.credentials.get()
simgesini kullanın. WebOTP, bu yönteme yeni bir otp
seçeneği ekler. Yalnızca bir özelliği vardır: transport
. Bu özelliğin değeri, 'sms'
dizesini içeren bir dizi olmalıdır.
JavaScript
…
navigator.credentials.get({
otp: { transport:['sms'] }
…
}).then(otp => {
…
Bu, bir SMS mesajı geldiğinde tarayıcının izin akışını tetikler. İzin verilirse döndürülen söz, bir OTPCredential
nesnesi ile çözülür.
Alınan OTPCredential
nesnesinin içeriği
{
code: "123456" // Obtained OTP
type: "otp" // `type` is always "otp"
}
Ardından, OTP değerini <input>
alanına iletin. Formu doğrudan göndermek, kullanıcının bir düğmeye dokunmasını gerektiren adımı ortadan kaldırır.
JavaScript
…
navigator.credentials.get({
otp: { transport:['sms'] }
…
}).then(otp => {
input.value = otp.code;
if (form) form.submit();
}).catch(err => {
console.error(err);
});
…
İletiyi iptal etme
Kullanıcı manuel olarak bir tek kullanımlık şifre girip formu gönderirse options
nesnesinde bir AbortController
örneği kullanarak get()
çağrısını iptal edebilirsiniz.
JavaScript
…
const ac = new AbortController();
…
if (form) {
form.addEventListener('submit', e => {
ac.abort();
});
}
…
navigator.credentials.get({
otp: { transport:['sms'] },
signal: ac.signal
}).then(otp => {
…
SMS mesajını biçimlendirme
API'nin kendisi yeterince basit görünse de kullanmadan önce bilmeniz gereken birkaç nokta vardır. Mesaj, navigator.credentials.get()
çağrıldıktan sonra gönderilmeli ve get()
çağrıldığı cihazda alınmalıdır. Son olarak, mesaj aşağıdaki biçime uygun olmalıdır:
- Mesaj, en az bir sayı içeren dört ila on karakterlik bir alfanümerik dize içeren (isteğe bağlı) kullanıcı tarafından okunabilir bir metinle başlar. Son satır URL ve OTP için ayrılır.
- API'yi çağıran web sitesinin URL'sinin alan adının önünde
@
olmalıdır. - URL, pound işareti ("
#
") ve ardından OTP içermelidir.
Örneğin:
Your OTP is: 123456.
@www.example.com #123456
Aşağıda kötü örnekler verilmiştir:
Örnek hatalı SMS metni | Bu yöntem neden işe yaramaz? |
---|---|
Here is your code for @example.com #123456 |
@ , son satırın ilk karakteri olmalıdır. |
Your code for @example.com is #123456 |
@ , son satırın ilk karakteri olmalıdır. |
Your verification code is 123456 @example.com\t#123456 |
@host ile #code arasında tek bir boşluk olması gerekir. |
Your verification code is 123456 @example.com #123456 |
@host ile #code arasında tek bir boşluk olması gerekir. |
Your verification code is 123456 @ftp://example.com #123456 |
URL şeması eklenemez. |
Your verification code is 123456 @https://example.com #123456 |
URL şeması eklenemez. |
Your verification code is 123456 @example.com:8080 #123456 |
Bağlantı noktası eklenemez. |
Your verification code is 123456 @example.com/foobar #123456 |
Yol eklenemez. |
Your verification code is 123456 @example .com #123456 |
Alanda boşluk yok. |
Your verification code is 123456 @domain-forbiden-chars-#%/:<>?@[] #123456 |
Alanda yasaklanmış karakter yok. |
@example.com #123456 Mambo Jumbo |
@host ve #code 'nin son satır olması gerekir. |
@example.com #123456 App hash #oudf08lkjsdf834 |
@host ve #code değerlerinin son satır olması gerekir. |
Your verification code is 123456 @example.com 123456 |
# eksik. |
Your verification code is 123456 example.com #123456 |
@ eksik. |
Hi mom, did you receive my last text |
@ ve # eksik. |
Demolar
Demoda çeşitli mesajları deneyin: https://web-otp.glitch.me
Ayrıca, bu projeyi çatallayarak kendi sürümünüzü de oluşturabilirsiniz: https://glitch.com/edit/#!/web-otp.
Kaynaklar arası iframe'den WebOTP kullanma
Kaynaklar arası bir iFrame'e SMS OTP girmek, genellikle ödeme onayı için kullanılır (özellikle 3D Secure ile). WebOTP API, çapraz kaynak iFrame'leri desteklemek için ortak bir biçime sahip olduğundan iç içe yerleştirilmiş kaynaklara bağlı OTP'ler sunar. Örneğin:
- Bir kullanıcı, kredi kartıyla ayakkabı satın almak için
shop.example
'yi ziyaret eder. - Entegre ödeme sağlayıcı, kredi kartı numarasını girdikten sonra bir iframe içinde
bank.example
'ten gelen ve kullanıcıdan hızlı ödeme için telefon numarasını doğrulamasını isteyen bir form gösterir. bank.example
, kullanıcının kimliğini doğrulamak için girebileceği bir OTP içeren bir SMS gönderir.
WebOTP API'yi kaynak farklı bir iFrame'den kullanmak için iki şey yapmanız gerekir:
- SMS metin mesajında hem üst çerçeve kaynağını hem de iframe kaynağını ek açıklamayla belirtin.
- Kaynaklar arası iFrame'in doğrudan kullanıcıdan OTP almasına izin verecek şekilde izin politikasını yapılandırın.
Demoyu https://web-otp-iframe-demo.stackblitz.io adresinden deneyebilirsiniz.
SMS kısa mesajına bağlı kaynakları ek açıklamayla belirtme
WebOTP API bir iframe'den çağrıldığında SMS kısa mesajı, @
ile başlayan üst çerçeve kaynağını, ardından #
ile başlayan OTP'yi ve son satırda @
ile başlayan iframe kaynağını içermelidir.
Your verification code is 123456
@shop.example #123456 @bank.exmple
İzin Politikası'nı yapılandırma
WebOTP'yi çapraz kaynaklı bir iFrame'de kullanmak için yerleşimcinin, istenmeyen davranışları önlemek amacıyla otp-credentials izin politikası aracılığıyla bu API'ye erişim izni vermesi gerekir. Genel olarak bu hedefe ulaşmanın iki yolu vardır:
HTTP üst bilgisi aracılığıyla:
Permissions-Policy: otp-credentials=(self "https://bank.example")
iframe allow
özelliği aracılığıyla:
<iframe src="https://bank.example/…" allow="otp-credentials"></iframe>
İzin politikasının nasıl belirtileceğine dair daha fazla örnek
WebOTP'yi masaüstünde kullanma
Chrome'da WebOTP, kullanıcıların masaüstünde telefon numarası doğrulamasını tamamlamasına yardımcı olmak için diğer cihazlarda alınan SMS'leri dinlemeyi destekler.
Bu özellik için kullanıcının hem masaüstü Chrome'da hem de Android Chrome'da aynı Google Hesabı ile oturum açması gerekir.
Tüm geliştiricilerin yapması gereken, mobil web sitelerinde yaptıkları gibi WebOTP API'yi masaüstü web sitelerine uygulamaktır. Bunun için özel bir işlem yapılması gerekmez.
Daha fazla bilgi için WebOTP API'yi kullanarak masaüstünde telefon numarasını doğrulama başlıklı makaleyi inceleyin.
SSS
Doğru biçimlendirilmiş bir mesaj gönderiyorum ancak iletişim kutusu görünmüyor. Sorun nedir?
API'yi test ederken dikkat edilmesi gereken birkaç nokta vardır:
- Gönderenin telefon numarası alıcının kişi listesine dahil edilmişse temel SMS Kullanıcı Rızası API'sinin tasarımı nedeniyle bu API tetiklenmez.
- Android cihazınızda iş profili kullanıyorsanız ve WebOTP çalışmıyorsa Chrome'u kişisel profilinize (ör. SMS mesajları aldığınız profil) yükleyip kullanmayı deneyin.
SMS'inizin doğru biçimlendirilip biçimlendirilmediğini görmek için biçimi tekrar kontrol edin.
Is this API compatible between different browsers?
Chromium ve WebKit, SMS kısa mesaj biçimi konusunda anlaştı ve Apple, iOS 14 ve macOS Big Sur'dan itibaren Safari'nin bu biçimi desteklediğini duyurdu. Safari, WebOTP JavaScript API'yi desteklemese de input
öğesine autocomplete=["one-time-code"]
notu eklendiğinde varsayılan klavye, SMS mesajı biçime uygunsa OTP'yi girmenizi otomatik olarak önerir.
Kimlik doğrulama yöntemi olarak SMS kullanmak güvenli mi?
SMS tek kullanımlık şifresi, telefon numarası ilk kez sağlandığında telefon numarasını doğrulamak için kullanışlı olsa da telefon numaraları operatörler tarafından ele geçirilip yeniden kullanılabildiğinden, SMS üzerinden telefon numarası doğrulama işlemi yeniden kimlik doğrulama için dikkatli bir şekilde kullanılmalıdır. WebOTP, kullanışlı bir yeniden kimlik doğrulama ve kurtarma mekanizmasıdır ancak hizmetlerin bunu bilgi yarışması gibi ek faktörlerle birleştirmesi veya güçlü kimlik doğrulama için Web Authentication API'yi kullanması gerekir.
Chrome'un uygulanmasındaki hataları nereye bildirebilirim?
Chrome'un uygulamasında bir hata mı buldunuz?
- crbug.com adresinden hata kaydı oluşturun. Mümkün olduğunca fazla ayrıntı ve yeniden oluşturmayla ilgili basit talimatlar ekleyin ve Bileşenler'i
Blink>WebOTP
olarak ayarlayın.
Bu özellik için nasıl yardımcı olabilirim?
WebOTP API'yi kullanmayı planlıyor musunuz? Herkese açık desteğiniz, özelliklere öncelik vermemize yardımcı olur ve diğer tarayıcı tedarikçi firmalarına bu özellikleri desteklemenin ne kadar önemli olduğunu gösterir.
#WebOTP
hashtag'ini kullanarak @ChromiumDev hesabına tweet gönderin ve bu özelliği nerede ve nasıl kullandığınızı bize bildirin.