Pola perusahaan untuk otentikasi JWT untuk aplikasi berbasis REST?

9

Spesifikasi JWT hanya menjelaskan muatan dan cara pengirimannya, tetapi membiarkan protokol otentikasi tetap terbuka, yang memungkinkan fleksibilitas, tetapi sayangnya, fleksibilitas dapat mengarah pada antiputerns dan misdesign.

Saya mencari beberapa pemikiran yang baik dan diuji coba perusahaan untuk otentikasi JWT, yang bisa saya gunakan atau adaptasi, tetapi saya gagal menemukan sesuatu yang lengkap.

Apa yang saya pikirkan adalah:

  • ketika tidak ada tajuk Otorisasi terpenuhi, atau token JWT tidak valid, atau kedaluwarsa, kirim HTTP 401
  • untuk mengotentikasi, gunakan / masuk saluran REST, kirim nama pengguna dan kata sandi sebagai objek JSON
  • untuk menjaga token tetap hidup, gunakan / keepalive REST channel, panggil setiap N (5) menit, terima token JWT baru dan ganti yang ada setelah setiap panggilan (token berakhir setelah M (15) menit)

Namun, yang mengganggu saya, adalah perlunya saluran / keepalive itu. Di sisi lain, itu memaksa saya untuk mencegah otentikasi berakhir, bahkan jika pengguna pergi (keputusan, jika kita ingin keepalive belum terpenuhi) dan tentu saja, itu adalah panggilan tambahan dan komplikasi tambahan untuk protokol. Yang menarik, server itu secara otomatis memperpanjang token. Di lingkungan berbasis sesi, hal itu terjadi dengan menyetel ulang stempel waktu, namun, di sini server harus mengirim token baru, mungkin tidak setiap kali, tetapi begitu token akan kedaluwarsa dalam R (katakanlah, 10) menit. Tetapi menempatkannya di badan respons akan berarti memodifikasi protokol respons JSON (oleh karena itu, solusinya invasif dan tidak transparan), dan menempatkan header HTTP tambahan yang dapat diproses klien tidak serta merta merupakan pola yang baik. SAYA'

Apakah ada pola perusahaan siap yang menjawab poin terbuka saya? Apakah draft protokol saya ide yang dapat diandalkan? Saya lebih suka menggunakan sesuatu yang siap daripada desain dari awal.


sumber
1
Iya. JWT telah memimpin banyak orang untuk mengimplementasikan 'protokol' buatan sendiri dan membuang kode kerangka kerja yang telah terbukti. Untuk mendapatkan solusi yang tepat, penting untuk menjelaskan persyaratan. Kedengarannya seperti 'sesi' kedaluwarsa adalah persyaratan. Apakah pemaksaan keluar sebagai persyaratan? yaitu di mana seseorang di sisi server dapat mengatakan, logout pengguna ini, atau pengguna dapat mengatakan logout semua sesi saya.
joshp

Jawaban:

4

JWT ( Intro to JSON Web Token ) hanyalah format token, otentikasi itu sesuatu yang sepenuhnya di luar ruang lingkup untuk spesifikasi itu. Ini memang biasa digunakan dalam sistem otentikasi, tetapi Anda juga bisa menggunakannya untuk skenario yang sama sekali berbeda sehingga masuk akal untuk tidak memasukkan batasan spesifik otentikasi dalam spesifikasi tersebut.

Jika Anda mencari panduan tentang otentikasi, Anda harus merujuk ke keluarga spesifikasi OpenID Connect . Selain itu, jika sistem Anda terdiri dari HTTP API dan Anda tertarik untuk menyediakan akses yang didelegasikan ke API tersebut untuk Anda sendiri atau ke aplikasi klien pihak ketiga, maka Anda harus merujuk ke spesifikasi OAuth 2.0 .

Ada protokol terkait otentikasi tambahan seperti SAML dan WS-Federation yang masih banyak digunakan dalam skenario perusahaan, tetapi mereka secara signifikan lebih kompleks untuk diimplementasikan.

Tentang titik terbuka spesifik Anda:

  • Skema autentikasi token pembawa didefinisikan dalam RFC 6750 yang berisi instruksi tentang cara melakukan permintaan dan kemungkinan kode kesalahan .
  • OAuth2 dan OpenID Connect keduanya merenungkan kemungkinan dan menentukan cara untuk bertukar nama pengguna / kata sandi dengan token.
  • Masalah memperpanjang seumur hidup mandiri / berdasarkan nilai token (JWT) diatasi dalam OpenID Connect dan OAuth2 melalui sarana token penyegaran .

Meskipun OAuth2 dan OpenID Connect dapat dilihat lebih mudah diimplementasikan daripada beberapa pendahulunya, mereka masih cukup kompleks untuk menjamin kehati-hatian dan hanya menerapkannya sendiri jika Anda bersedia menghabiskan banyak waktu dan sumber daya. Biasanya merupakan pilihan yang lebih baik untuk menggunakan perpustakaan atau layanan pihak ketiga yang melakukan hal yang berat untuk Anda.

Akhirnya, protokol-protokol ini mencakup banyak skenario sehingga mereka mungkin berlebihan dalam beberapa situasi.

João Angelo
sumber
2
+1 untuk menjamin kehati-hatian & jawaban lengkap untuk pertanyaan yang tersirat daripada yang tertulis.
Paul
3

Saya tidak berpikir Anda membutuhkan saluran keepalive. Payload Anda dapat (dan disarankan untuk) berisi informasi kedaluwarsa yang disediakan oleh server (dalam expkunci, sesuai standar ) ketika token dibuat saat login. Jika token kadaluarsa digunakan (yang, jelas, ditentukan oleh server, yang hanya mempercayai apa yang ada dalam token jika tanda tangan validasi), server hanya menolaknya dengan HTTP 401, mendorong klien untuk mengautentikasi ulang.

Klien, sementara itu, bisa proaktif. Bagian payload tidak dienkripsi, dan karena klien dapat membacanya, klien dapat memastikan kapan permintaan akan dikirim dengan token yang kadaluwarsa, dan oleh karena itu menelepon /loginlagi jika token tersebut kadaluarsa.

Sebagai alternatif, REST memungkinkan informasi hypermedia dikirimkan sebagai 'mesin negara', dan jika Anda mau, Anda bisa benar-benar membuat satu-satunya penggunaan JWT Anda, dan dengan kedaluwarsa juga. Setiap permintaan, kemudian, akan menghasilkan JWT baru yang dikembalikan sebagai respons kepada klien, baik dalam konten atau lebih mungkin dalam header respons, seperti yang dilakukan hapi-auth-jwt2 .

Paul
sumber