Saya mencoba mengatur alur autentikasi WebAuthn di situs web saya, tetapi saya mengalami masalah. Saya ingin pengguna saya dapat mendaftarkan perangkat mereka di situs web utama (www.domain.com) sehingga mudah diakses melalui pengaturan pengguna mereka. Otentikasi itu sendiri terjadi pada subdomain yang berbeda melalui IdP (sso.domain.com). Di sinilah masalah dimulai.

Ada beberapa hal yang saya coba:

  • Registrasi dan otentikasi di www.scoutswechel.be, lewat 'www.scoutswechel.be' sebagai rp.id untuk keduanya => berfungsi.
  • Pendaftaran di www.scoutswechel.be, otentikasi di sso.scoutswechel.be, melewati 'www.scoutswechel.be' sebagai rp.id untuk keduanya => langkah otentikasi gagal karena authenticator tidak mengembalikan kunci apa pun.
  • Pendaftaran di www.scoutswechel.be, otentikasi di sso.scoutswechel, melewati domain tersebut masing-masing sebagai rp.id => langkah otentikasi gagal karena autentikator tidak mengembalikan kunci apa pun.
  • Pendaftaran di www.scoutswechel.be, otentikasi di sso.scoutswechel.be, meneruskan 'scoutswechel.be' sebagai rp.id untuk keduanya => langkah pendaftaran sudah gagal dengan kesalahan yang berbeda untuk browser yang berbeda (misalnya 'kunci mengembalikan sesuatu yang tidak terduga (2) ' dalam krom).

Jika saya memahami spesifikasi dengan benar, melewati 'scoutswechel.be' seharusnya benar-benar berfungsi karena kedua domain adalah subdomain dari domain utama (koreksi saya jika saya salah di sini).

Saya mempersiapkan tantangan saya dengan PHP dan meneruskannya ke halaman dengan panggilan ajax. Skrip PHP saya mengembalikan misalnya nilai berikut:

{
   "publicKey":{
      "challenge":[105,107,101,103,105,49,119,115,98,108,119,109,48,109,105,53],
      "user":{
         "name":"walter",
         "displayName":"Wouter Henderickx",
         "id":[49,48,51]
      },
      "rp":{
         "id":"scoutswechel.be",
         "name":"scoutswechel.be"
      },
      "pubKeyCredParams":[
         {
            "alg":-7,
            "type":"public-key"
         }
      ],
      "authenticatorSelection":{
         "authenticatorAttachment":"cross-platform",
         "requireResidentKey":false,
         "userVerification":"preferred"
      },
      "attestation":null,
      "timeout":60000,
      "excludeCredentials":[],
      "extensions":{
         "exts":true
      }
   },
   "b64challenge":"aWtlZ2kxd3NibHdtMG1pNQ"
}

Saya kemudian mengonversi tantangan dan user.id ke Uint8Array dan meneruskan bagian kunci publik ke:

navigator.credentials.create({publicKey: key.publicKey}).
	then(function (aNewCredentialInfo) {
		do.stuff()
	})

Bagaimana saya harus melakukan ini? Nilai apa yang dapat saya berikan ke rp.id agar ini berfungsi di kedua subdomain?

4
vixducis 10 Maret 2019, 20:48

1 menjawab

Jawaban Terbaik

Pada akhirnya, saya menemukan jawabannya. Ini semua adalah masalah implementasi di pihak saya:

  • Di perpustakaan saya mendasarkan proyek saya (https://github.com/daviearl/webauthn), ada sepotong javascript yang membandingkan nilai rp.name dengan asalnya. Karena saya memberikan nama non-domain, pemeriksaan ini memblokir eksekusi lebih lanjut.
  • Saya melewati 'rpid' untuk pengidentifikasi pihak yang mengandalkan. Namun, ini seharusnya 'rpId'. Karena autentikator saya tidak dapat menemukan kredensial apa pun tanpa rpid, itu tidak mengembalikan apa pun dan saya tidak diautentikasi.
0
vixducis 27 Mei 2019, 10:06