Ketika mengubah domain, pengguna harus mengotorisasi pada domain baru, pengaturan aplikasi lokal akan hilang, pengguna SSO tidak akan bisa masuk tanpa pengaturan tambahan di pihak mereka - semua ini bukan ramah pengguna, frekuensi pemulihan kata sandi akan meningkat, dan beberapa pengguna tidak bisa sama sekali akan menggunakan aplikasi ini segera.
Untuk meminimalkan kehilangan lalu lintas setelah mengubah domain, penting untuk memigrasikan pengguna yang berwenang dari domain lama ke yang baru:
- Mendukung pengguna yang masuk menggunakan penyedia SSO melalui domain lama.
- Transfer token otorisasi pengguna dari domain lama ke domain baru.
- Transfer LocalStorage dengan pengaturan pengguna untuk aplikasi.
Transmisi dan enkripsi data
Diputuskan untuk mentransfer token menggunakan get-parameter, karena situs tidak menggunakan penyimpanan di mana token dapat disimpan dan digunakan kembali. Tidak aman untuk meneruskan token ke publik melalui parameter get, itu harus dilindungi dari intersepsi. Kami memiliki dua metode enkripsi: OpenSSL dan Mcrypt. Mcrypt belum diperbarui untuk waktu yang lama, ia mengenkripsi data lebih lambat dibandingkan dengan OpenSSL, dan kami tidak perlu memuat tambahan di server. Oleh karena itu, kami mengenkripsi token menggunakan OpenSSL.
Namun, hash yang dihasilkan masih bisa dicegat dan digunakan lagi. Untuk mencegah token agar tidak digunakan kembali, kami menambahkan parameter "tanggal enkripsi", sehingga hash berlaku selama 10 detik - kali ini cukup dengan margin untuk melakukan semua operasi. Kami juga menambahkan kunci enkripsi pengganti setiap 12 jam, kunci disimpan di Vault dan disinkronkan antar situs.
Hash yang dihasilkan dilewatkan sebagai parameter get dan juga diproses menggunakan url_encode untuk transmisi aman melalui URL, karena karakter dapat melarikan diri atau merusak struktur alamat.
Struktur hash:
url_encode(OpenSSL({
'token': '',
'date': ' ',
'additional_values': ['param', 'param']
}))
LocalStorage hanya dapat diakses melalui JavaScript. Untuk mengatasi masalah ini, antarmuka postMessage dan iframe dipilih, yang memungkinkan untuk mengirim permintaan lintas-domain dengan aman. Data di LocalStorage dikonversi ke string menggunakan JSON.stringify () dan ditransfer ke domain miro.com, di mana data itu dikonversi kembali dan ditulis ke LocalStorage dari domain miro.com.
Skema kerja dengan deskripsi semua langkah
Diagram ini dalam bentuk yang mudah dilihat .
Pengguna dapat masuk ke layanan dengan dua cara: melalui domain lama realtimeboard.com (misalnya, dari bookmark) atau melalui miro.com baru (misalnya, melalui iklan).
Jika pengguna pergi ke domain lama:
- Setelah membuka halaman realtimeboard.com, enkripsi token pengguna, tanggal pembuatan dan informasi layanan tambahan dilakukan.
- miro.com/migration/?data={hash} hash Get . , . .
- miro.com , , , , .
- migrationToken, .
- LocalStorage migrationLocalstorage. , JS-, iFrame relatimeboard.com/localstorage/ postmessage , .
Jika pengguna pergi langsung ke domain miro.com baru, pengguna diperiksa karena meneruskan migrasi token dan LocalStorage. Jika pengguna telah menyelesaikan migrasi, maka ia tetap berada di domain miro.com. Jika Anda tidak menyelesaikannya, pengalihan terjadi di realtimeboard.com untuk mendapatkan token (untuk ini kami menyimpan dua bendera di cookie: migrasiToken dan migrasiLocalstorage).
Skema ini juga bekerja dengan baik untuk pengguna SSO yang masuk ke domain lama realtimeboard.com. Daftar rute ditambahkan yang berfungsi tanpa memigrasi token ke domain baru. Mereka termasuk rute untuk SSO, yang dieksekusi seperti biasa dan dialihkan ke / app / atau / login / tergantung pada kondisi kerjanya, setelah itu mekanisme migrasi token terhubung lagi.
Keluaran
Saya menghabiskan satu bulan untuk penelitian dan persiapan, satu bulan lagi di run-in (pada saat yang sama saya terlibat dalam proyek lain). Dengan solusi ini, kami dapat memigrasikan pengguna resmi dari domain lama ke yang baru dan mendukung pengguna yang menggunakan SSO untuk mengautentikasi melalui domain lama.