Saya merancang layanan web RESTful yang perlu diakses oleh pengguna, tetapi juga layanan dan aplikasi web lain. Semua permintaan yang masuk perlu diautentikasi. Semua komunikasi berlangsung melalui HTTPS. Otentikasi pengguna akan bekerja berdasarkan token otentikasi, yang diperoleh dengan mem-posting nama pengguna dan kata sandi (melalui koneksi SSL) ke sumber / sesi yang disediakan oleh layanan.
Dalam kasus klien layanan web, tidak ada pengguna akhir di belakang layanan klien. Permintaan dimulai oleh tugas terjadwal, acara atau beberapa operasi komputer lainnya. Daftar layanan penghubung sudah diketahui sebelumnya (jelas, saya kira). Bagaimana cara mengautentikasi permintaan ini yang berasal dari layanan (web) lain? Saya ingin proses otentikasi semudah mungkin diterapkan untuk layanan tersebut, tetapi tidak dengan mengorbankan keamanan. Apa standar dan praktik terbaik untuk skenario seperti ini?
Opsi yang dapat saya pikirkan (atau telah disarankan kepada saya):
Minta layanan klien menggunakan nama pengguna dan sandi "palsu", dan lakukan otentikasi dengan cara yang sama seperti pengguna. Saya tidak suka opsi ini - rasanya tidak benar.
Tetapkan ID aplikasi permanen untuk layanan klien, mungkin juga kunci aplikasi. Sejauh yang saya mengerti, ini sama dengan memiliki nama pengguna + kata sandi. Dengan id dan kunci ini, saya dapat mengautentikasi setiap permintaan, atau membuat token otentikasi untuk mengautentikasi permintaan lebih lanjut. Bagaimanapun, saya tidak suka opsi ini, karena siapa pun yang bisa mendapatkan id dan kunci aplikasi dapat menyamar sebagai klien.
Saya bisa menambahkan pemeriksaan alamat IP ke opsi sebelumnya. Ini akan membuat lebih sulit untuk melakukan permintaan palsu.
Sertifikat klien. Siapkan otoritas sertifikat saya sendiri, buat sertifikat dasar, dan buat sertifikat klien untuk layanan klien. Namun, ada beberapa masalah yang muncul di benak saya: a) bagaimana saya masih mengizinkan pengguna untuk mengautentikasi tanpa sertifikat dan b) seberapa rumit penerapan skenario ini dari sudut pandang layanan klien?
Sesuatu yang lain - pasti ada solusi lain di luar sana?
Layanan saya akan berjalan di Java, tetapi saya sengaja meninggalkan informasi tentang kerangka khusus apa yang akan dibangunnya, karena saya lebih tertarik pada prinsip-prinsip dasar dan tidak begitu banyak pada detail implementasi - Saya berasumsi solusi terbaik untuk ini akan dapat diterapkan terlepas dari kerangka kerja yang mendasarinya. Namun, saya sedikit tidak berpengalaman dengan subjek ini, jadi tips dan contoh konkret tentang implementasi aktual (seperti perpustakaan pihak ketiga yang bermanfaat, artikel, dll.) Akan sangat dihargai.