Ada banyak informasi di web tentang penggunaan JWT ( Json Web Token
) untuk otentikasi. Tetapi saya masih tidak menemukan penjelasan yang jelas tentang bagaimana alurnya saat menggunakan token JWT untuk solusi sistem masuk tunggal di lingkungan beberapa domain .
Saya bekerja untuk perusahaan yang memiliki banyak situs di host yang berbeda. Mari gunakan example1.com dan example2.com . Kami memerlukan solusi sistem masuk tunggal, yang berarti jika pengguna mengautentikasi di example1.com , kami ingin dia juga diautentikasi di example2.com , secara otomatis.
Dengan menggunakan alur OpenId Connect , saya memahami bahwa pengguna yang ingin mengautentikasi di example1.com akan dialihkan ke server otentikasi terlebih dahulu (atau OP
: "Penyedia OpenId"). Pengguna mengautentikasi di server itu yang kemudian mengarahkannya kembali ke situs example1.com asli dengan token JWT yang ditandatangani. (Saya mengerti ada aliran lain yang mengembalikan token perantara yang dengan sendirinya dapat ditukar dengan token JWT asli nanti, tetapi saya rasa ini tidak diperlukan untuk kami) ...
Jadi sekarang pengguna kembali ke example1.com dan diautentikasi! Dia dapat membuat permintaan, meneruskan token JWT di Authentication
header dan server dapat memverifikasi JWT yang ditandatangani dan oleh karena itu dapat mengidentifikasi pengguna. Bagus!
Pertanyaan pertama :
Bagaimana cara menyimpan token JWT di klien? Sekali lagi, ada banyak informasi tentang ini, dan orang-orang tampaknya setuju bahwa menggunakan Web Storage
adalah cara untuk pergi daripada yang baik cookies
. Kami ingin JWT menjadi persisten antara browser dimulai ulang jadi mari gunakan Local Storage
, bukan Session Storage
...
Sekarang pengguna dapat memulai ulang browsernya dan dia akan tetap diautentikasi di example1.com , selama token JWT tidak kedaluwarsa!
Selain itu, jika example1.com perlu membuat permintaan Ajax ke domain kami yang lain, saya memahami mengonfigurasi CORS akan memungkinkannya. Namun kasus penggunaan utama kami bukanlah permintaan lintas domain, ini memiliki solusi sistem masuk tunggal !
Karena itu, pertanyaan utamanya:
Sekarang, bagaimana seharusnya alurnya , jika pengguna membuka example2.com dan kita ingin dia diautentikasi, menggunakan token JWT yang sudah dia miliki? Local Storage
sepertinya tidak mengizinkan akses lintas domain, jadi pada saat ini browser tidak dapat membaca token JWT untuk membuat permintaan ke example2.com !
Sebaiknya :
- Pengguna dialihkan ke server otentikasi lagi? Ketika pengguna mengautentikasi untuk example1.com , server otentikasi mungkin telah menyetel cookie pada pengguna sehingga permintaan otentikasi baru untuk example2.com ini dapat menggunakan cookie itu untuk melihat bahwa pengguna sudah diautentikasi dan segera mengarahkannya kembali ke example2.com dengan token JWT yang sama?
- Atau dapatkah browser, di example2.com , mengakses token JWT tanpa harus pergi ke server otentikasi lagi? Saya melihat ada solusi penyimpanan silang , tetapi apakah itu banyak digunakan? Apakah itu solusi yang disarankan untuk lingkungan SSO lintas domain?
Kami tidak menginginkan sesuatu yang mewah, kami akan senang dengan solusi yang paling banyak digunakan!
sumber
Mengarahkan pengguna ke layanan otentikasi pusat ketika pengguna tidak masuk untuk meminta kredensial dan mengeluarkan token otentikasi baru adalah skenario umum dalam sistem Masuk Tunggal menggunakan protokol terkenal seperti oauth2 atau OpenId Connect
Namun ketika skema ini digunakan di seluruh domain, kelemahan utamanya adalah pengguna akan dialihkan dan diautentikasi setiap kali dia menavigasi ke domain lain karena kebijakan yang sama-asal : token akses tidak dapat dibagikan antar domain (
example2.com
tidak dapat mengakses data dariexample1.com
), sehingga domain target akan memperlakukan pengguna sebagai tidak terautentikasi, mengarahkannya ke layanan SSO pusat.Untuk mencegah layanan otentikasi meminta ulang kredensial, biasanya memiliki cookie sesi (bukan token akses), tetapi ada teknik untuk berbagi data di seluruh domain menggunakan penyimpanan lokal / cookie browser dan iframe yang mengarah ke domain perantara
sso.example.com
Untuk mengautentikasi pengguna di
example1.com
, arahkan dia ke server otentikasi disso.example.com
, keluarkan JWT setelah mengautentikasi dan simpan di Penyimpanan lokal domain ini. Setelah ini, alihkan pengguna ke domain asal example1.comBuat iframe yang
example2.com
mengarah kesso.example.com
. Iframe di sso.example.com membaca token JWT dan mengirim pesan ke halaman indukHalaman induk menerima pesan dan mendapatkan token terlampir yang melanjutkan aliran SSO
Tidak ada masalah dengan kebijakan asal yang sama karena
sso.example.com
memiliki akses ke penyimpanan lokalnya dan komunikasi antara iframe dan halaman induk diperbolehkan jika domain asal dan target saling mengenali (lihat http://blog.teamtreehouse.com/cross-domain- olahpesan-dengan-postmessage )Untuk menyederhanakan pengembangan, baru-baru ini kami merilis SSO lintas domain dengan JWT di https://github.com/Aralink/ssojwt
Metode ini sangat cocok dengan aliran SSO. Ini hanyalah cara untuk membagikan token otentikasi tanpa pengalihan dan menghindari log-in yang tidak perlu ketika domain digabungkan
sumber
Tidak yakin apakah ini menjawab pertanyaan Anda, tetapi jika tujuan utama Anda adalah sistem masuk tunggal, menurut saya proxy balik sederhana akan menyelesaikan masalah Anda (setidaknya penyimpanan lintas domain).
Jadi example1.com example2.com
akan menjadi seperti
example.com/example1
example.com/example2
(Dan dari sisi pengguna, ini biasanya lebih bersih)
Jika itu bukan pilihan, Anda mungkin harus mengatur sehingga ketika pengguna mengautentikasi dalam 1 domain, ia menggunakan AJAX / iframe tersembunyi untuk membuat otentikasi dengan domain lain juga (mengirim token 1 kali melalui url jika Anda harus ).
dan jika ITU bukan pilihan, Anda mungkin harus menggunakan nama pengguna + pin, karena browser semakin ketat tentang interaksi lintas-domain.
sumber