Saya membuat api REST, mengikuti saran apigee dengan seksama, menggunakan kata benda bukan kata kerja, versi api dimasukkan ke dalam url, dua jalur api per koleksi, DAPATKAN penggunaan POST PUT DELETE, dll.
Saya bekerja pada sistem login, tetapi tidak yakin tentang cara REST yang tepat untuk login pengguna. Saya tidak bekerja pada keamanan pada saat ini, hanya pola atau aliran login. (Nanti kita akan menambahkan 2 langkah oAuth, dengan HMAC, dll)
Opsi yang Mungkin
- POST untuk sesuatu seperti
https://api...com/v1/login.json
- TETAP untuk sesuatu seperti
https://api...com/v1/users.json
- Sesuatu yang saya belum ...
Apa gaya REST yang tepat untuk login pengguna?
api
rest
design-patterns
Scott Roepnack
sumber
sumber
Accept
header HTTP.Accept
tajuk, Anda juga akan memilikiVary: Accept
, jadi caching tidak akan terpengaruh. Sambungan dalam ekstensi telah dibahas sebelumnya ; Saya setuju dengan jawaban Shonzilla di sana.Jawaban:
Desain Prinsip Arsitektur Web Modern oleh Roy T. Fielding dan Richard N. Taylor , yaitu urutan karya dari semua terminologi REST, berisi definisi interaksi klien-server:
Pembatasan ini menyelesaikan empat fungsi, 1 dan 3 penting dalam kasus khusus ini:
Dan sekarang mari kita kembali ke kasus keamanan Anda. Setiap permintaan tunggal harus berisi semua informasi yang diperlukan, dan otorisasi / otentikasi tidak terkecuali. Bagaimana cara mencapai ini? Secara harfiah mengirim semua informasi yang diperlukan melalui kabel dengan setiap permintaan.
Salah satu contoh cara mengaktifkan ini adalah kode otentikasi pesan berbasis hash atau HMAC . Dalam praktiknya ini berarti menambahkan kode hash pesan saat ini ke setiap permintaan. Kode hash dihitung oleh fungsi hash kriptografi dikombinasikan dengan kunci kriptografi rahasia . Fungsi hash kriptografis dapat ditentukan sebelumnya atau bagian dari konsepsi REST kode-atas-permintaan (misalnya JavaScript). Kunci kriptografi rahasia harus disediakan oleh server ke klien sebagai sumber daya, dan klien menggunakannya untuk menghitung kode hash untuk setiap permintaan.
Ada banyak contoh implementasi HMAC , tetapi saya ingin Anda memperhatikan tiga berikut:
Cara kerjanya dalam praktik
Jika klien mengetahui kunci rahasia, maka siap untuk beroperasi dengan sumber daya. Kalau tidak, dia akan sementara dialihkan (kode status 307 Pengalihan Sementara) untuk mengotorisasi dan mendapatkan kunci rahasia, dan kemudian dialihkan kembali ke sumber asli. Dalam hal ini tidak perlu tahu sebelumnya (yaitu hardcode di suatu tempat) apa URL untuk mengotorisasi klien , dan mungkin untuk menyesuaikan skema ini dengan waktu.
Semoga ini bisa membantu Anda menemukan solusi yang tepat!
sumber
TL; DR Login untuk setiap permintaan bukan komponen yang diperlukan untuk menerapkan keamanan API, otentikasi.
Sulit untuk menjawab pertanyaan Anda tentang login tanpa membicarakan keamanan secara umum. Dengan beberapa skema otentikasi, tidak ada login tradisional.
REST tidak menentukan aturan keamanan apa pun, tetapi implementasi yang paling umum dalam praktik adalah OAuth dengan otentikasi 3 arah (seperti yang telah Anda sebutkan dalam pertanyaan Anda). Tidak ada masuk per se, setidaknya tidak dengan setiap permintaan API. Dengan auth 3 arah, Anda hanya menggunakan token.
Skema ini memberi pengguna opsi untuk mencabut akses kapan saja. Secara praktis semua RESTful APIs yang tersedia untuk umum yang pernah saya lihat menggunakan OAuth untuk mengimplementasikannya.
Saya hanya tidak berpikir Anda harus membingkai masalah Anda (dan pertanyaan) dalam hal login, melainkan berpikir tentang mengamankan API secara umum.
Untuk info lebih lanjut tentang otentikasi API REST secara umum, Anda dapat melihat sumber daya berikut:
sumber
Bagian besar dari filosofi REST adalah untuk mengeksploitasi sebanyak mungkin fitur standar dari protokol HTTP saat merancang API Anda. Menerapkan filosofi itu untuk otentikasi, klien dan server akan menggunakan fitur otentikasi HTTP standar di API.
Layar masuk bagus untuk kasus penggunaan pengguna manusia: kunjungi layar masuk, berikan pengguna / kata sandi, set cookie, klien menyediakan cookie itu dalam semua permintaan di masa mendatang. Manusia yang menggunakan browser web tidak dapat diharapkan untuk memberikan id dan kata sandi pengguna dengan setiap permintaan HTTP individu.
Tetapi untuk API REST, layar masuk dan cookie sesi tidak sepenuhnya diperlukan, karena setiap permintaan dapat menyertakan kredensial tanpa memengaruhi pengguna manusia; dan jika klien tidak bekerja sama kapan saja,
401
respons "tidak sah" dapat diberikan. RFC 2617 menjelaskan dukungan otentikasi dalam HTTP.TLS (HTTPS) juga akan menjadi pilihan, dan akan memungkinkan otentikasi klien ke server (dan sebaliknya) dalam setiap permintaan dengan memverifikasi kunci publik dari pihak lain. Selain itu ini mengamankan saluran untuk bonus. Tentu saja, pertukaran keypair sebelum komunikasi diperlukan untuk melakukan ini. (Catatan, ini khusus tentang mengidentifikasi / mengautentikasi pengguna dengan TLS. Mengamankan saluran dengan menggunakan TLS / Diffie-Hellman selalu merupakan ide yang baik, bahkan jika Anda tidak mengidentifikasi pengguna dengan kunci publiknya.)
Contoh: misalkan token OAuth adalah kredensial masuk lengkap Anda. Setelah klien memiliki token OAuth, itu dapat diberikan sebagai id pengguna dalam otentikasi HTTP standar dengan setiap permintaan. Server dapat memverifikasi token pada penggunaan pertama dan menyimpan hasil cek dengan waktu-to-live yang diperbarui dengan setiap permintaan. Setiap permintaan yang membutuhkan otentikasi dikembalikan
401
jika tidak disediakan.sumber