Alur sistem masuk tunggal menggunakan JWT untuk autentikasi lintas domain

112

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 Authenticationheader 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 Storageadalah 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 Storagesepertinya 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!

electrotype
sumber

Jawaban:

28

Pengguna harus dialihkan ke server otentikasi lagi dan mendapatkan token baru (JWT), yang secara khusus ditargetkan untuk example2.com. Ini adalah cara kerja OpenID Connect dan protokol SSO federasi lintas domain lainnya.

Hans Z.
sumber
15
Tetapi tanpa pengguna harus mengirim ulang kredensial otentikasi (nama pengguna / kata sandi misalnya) karena itu SSO, bukan? Jadi, bagaimana caranya? Haruskah server otentikasi menetapkan cookie standar pada pengguna pertama kali, sehingga dapat secara otomatis mengautentikasinya ketika pengguna ini kembali dari domain baru?
electrotype
7
Tetapi bagaimana jika pengguna mengonfigurasi browser untuk memblokir semua cookie?
Christiaan Westerbeek
1
Saya kira peringatan harus ditempatkan tentang cookie bahwa "situs mungkin tidak berfungsi dengan baik jika browser Anda memblokir cookie"
AnBisw
single-signon tidak selalu menyiratkan bahwa pengguna memiliki sesi berkelanjutan yang dilacak oleh cookie: karakteristik yang menentukan adalah bahwa seseorang menggunakan kembali kredensial yang sama terhadap Penyedia Identitas yang sama untuk mendapatkan akses ke aplikasi pihak ketiga yang berbeda, yaitu tidak diperlukan cookie, hanya menggunakan kembali kredibilitas yang sama
Hans Z.
35

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.comtidak dapat mengakses data dari example1.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

  1. Untuk mengautentikasi pengguna di example1.com, arahkan dia ke server otentikasi di sso.example.com, keluarkan JWT setelah mengautentikasi dan simpan di Penyimpanan lokal domain ini. Setelah ini, alihkan pengguna ke domain asal example1.com

  2. Buat iframe yang example2.commengarah ke sso.example.com. Iframe di sso.example.com membaca token JWT dan mengirim pesan ke halaman induk

  3. Halaman induk menerima pesan dan mendapatkan token terlampir yang melanjutkan aliran SSO

Tidak ada masalah dengan kebijakan asal yang sama karena sso.example.commemiliki 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

pedrofb
sumber
3
Terlepas dari solusi ini yang tidak mengikuti standar, biasanya dalam SSO lintas domain, satu SSO melintasi batas administratif dan dalam kasus tersebut menggunakan JWT yang sama untuk kedua domain akan membuka kemungkinan bagi pemilik aplikasi di satu domain untuk menyamar sebagai pengguna di domain lain. domain
Hans Z.
6
Terima kasih @HansZ. Kami sebenarnya telah mengimplementasikan solusi ini untuk memiliki administrasi tunggal dari beberapa domain dengan lusinan aplikasi dan pengguna yang sama. Pengoperasiannya mirip dengan sistem Google (secara relatif)
pedrofb
2

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.

Tezra
sumber