Haruskah saya menyimpan klaim pengguna saya di token JWT?

18

Saya menggunakan token JWT di header HTTP untuk mengautentikasi permintaan ke server sumber daya. Server sumber daya dan server auth adalah dua peran pekerja terpisah di Azure.

Saya tidak dapat menentukan apakah saya harus menyimpan klaim dalam token atau melampirkannya ke permintaan / respons dengan cara lain. Daftar Klaim memengaruhi rendering elemen UI sisi klien serta akses ke data di server. Untuk alasan ini saya ingin memastikan bahwa klaim yang diterima oleh server adalah asli dan divalidasi sebelum permintaan diproses.

Contoh klaim adalah: CanEditProductList, CanEditShopDescription, CanReadUserDetails.

Alasan saya ingin menggunakan token JWT untuk mereka adalah:

  • Perlindungan yang lebih baik terhadap pengeditan klaim sisi klien (mis. Meretas daftar klaim).
  • Tidak perlu mencari klaim pada setiap permintaan.

Alasan saya tidak ingin menggunakan token JWT:

  • Server auth kemudian harus mengetahui daftar klaim app-centric.
  • Token menjadi satu titik masuk-hack.
  • Saya telah membaca beberapa hal yang mengatakan bahwa token JWT tidak dimaksudkan untuk data tingkat aplikasi.

Tampak bagi saya bahwa keduanya memiliki kekurangan, tetapi saya condong ke arah dimasukkannya klaim ini ke dalam token dan hanya ingin menjalankan ini oleh orang-orang yang pernah menangani ini sebelumnya.

CATATAN: Saya akan menggunakan HTTPS untuk semua permintaan API, jadi bagi saya tampaknya token akan cukup 'aman'. Saya menggunakan AngularJS, C #, Web API 2 dan MVC5.

Astravagran
sumber
baca ini sekarang .... dan ingin pembaruan jika Anda bisa. Saya akan tertarik pada apa yang Anda lakukan, karena saya menghadapi hal yang sama .. berpikir dan saya kehilangan bagaimana beberapa bagian dimaksudkan untuk bekerja. pengguna mendapat token otorisasi, tetapi kemudian bagaimana klaim dapat dilakukan ... dapatkah Anda menjelaskan temuan Anda ... karena mungkin akan membantu saya.
Seabizkit

Jawaban:

7

Saya menyimpan klaim pengidentifikasi saja (userid, dll.) (Terenkripsi) di jwt saya.

Kemudian ketika saya mendapatkan token di server (API) saya bisa melakukan pencarian sisi server (db, atau panggilan jaringan lokal) dan mengambil semua asosiasi ke userid (aplikasi, peran, dll.)

Namun jika Anda ingin memasukkan lebih banyak ke jwt, berhati-hatilah dengan ukurannya karena kemungkinan akan dikirim pada setiap permintaan, tetapi pastikan untuk mengenkripsi data klaim sensitif.

wchoward
sumber
Ceria, DL. Apakah Anda men-cache peran dll di server API, atau cukup tekan DB dua kali setiap kali Anda mendapatkan permintaan? (Yaitu sekali untuk peran dan sekali untuk data aktual yang diminta). Jika Anda menyimpannya, saya akan tertarik untuk mengetahui metode apa yang Anda gunakan. Juga, apakah Anda maksud Anda lebih lanjut mengenkripsi userid 'di dalam' token yang sudah dienkripsi? Terima kasih.
Astravagrant
1
Saya belum sampai sejauh itu dalam implementasi saya :), tapi ya saya sedang berpikir untuk menggunakan server caching sehingga dengan cara itu saya tidak akan menekan db sesering mungkin dan jika ada perubahan peran cache dapat dihapus untuk memungkinkan yang baru peran diminta untuk dimuat cache disimpan. Dalam kasus saya, saya mungkin akan menggunakan Amazon AWS elsticache yang didasarkan pada memcached terbuka tetapi lebih mudah untuk mengkonfigurasi dan menggunakan.
wchoward
Saya juga berpikir itu ide yang lebih baik untuk mendapatkan semua informasi yang diperlukan di server sumber daya dan tidak menyimpannya dalam token.
Mateusz Migała
jadi untuk setiap permintaan Anda mendapatkan peran pengguna ... klaim ..., dapatkah Anda mengarahkan saya ke artikel atau sesuatu yang menunjukkan ini layak. saat ini saya menggunakan sesi, tetapi mencari cara yang lebih baik dalam melakukan sesuatu, tetapi mencari pada setiap permintaan tidak terasa benar?
Seabizkit
3

Kedengarannya seperti otentikasi (siapa pengguna itu) dan otorisasi (apa yang diizinkan pengguna) tidak dibagi dengan jelas seperti yang Anda inginkan.

Jika Anda tidak ingin server otentikasi mengetahui hak pengguna untuk kemudian batasi klaim dalam JWT ke userid seperti yang disarankan wchoward. Anda bisa meminta server lain yang dikenal sebagai server otorisasi mencari tahu apa yang menjadi hak pengguna.

Langkah otorisasi dapat dilakukan oleh server sumber daya ketika pertama kali disajikan dengan token otentikasi oleh klien. Server sumber daya kemudian akan mengirim token ke klien yang berisi klaim otorisasi.

Catatan: Kedua JWT harus ditandatangani dengan kunci yang berbeda.

Pro:

  • Otentikasi dan otorisasi dikelola secara terpisah.
  • Server sumber daya tidak harus mencari otorisasi untuk setiap permintaan.
  • UI memiliki akses untuk melihat otorisasi tetapi tidak mengeditnya.

Menipu:

  • Klien perlu menangani dua token alih-alih satu.
  • Menambahkan server otorisasi menambahkan bagian bergerak lainnya untuk dikelola.
Chad Clark
sumber
1
Jangan lupa bahwa bahkan ketika Anda memeriksa otorisasi di UI, Anda masih harus memeriksa otorisasi di sisi server ketika ada permintaan.
Chad Clark