Gambaran
Saya ingin membuat API (REST) untuk aplikasi saya. Tujuan awal / utama adalah untuk konsumsi oleh aplikasi seluler (iPhone, Android, Symbian, dll). Saya telah mencari mekanisme berbeda untuk otentikasi dan otorisasi untuk API berbasis web (dengan mempelajari implementasi lainnya). Kepalaku terlilit sebagian besar konsep dasar tetapi saya masih mencari bimbingan di beberapa bidang. Hal terakhir yang ingin saya lakukan adalah menemukan kembali roda, tetapi saya tidak menemukan solusi standar yang sesuai dengan kriteria saya (namun kriteria saya salah kaprah, jadi jangan ragu untuk mengkritiknya juga). Selain itu, saya ingin API sama untuk semua platform / aplikasi yang menggunakannya.
o Ya
Saya akan melanjutkan dan membuang keberatan saya untuk oAuth karena saya tahu itu akan menjadi solusi pertama yang ditawarkan. Untuk aplikasi seluler (atau lebih khusus aplikasi non-web), sepertinya salah meninggalkan aplikasi (pergi ke browser web) untuk otentikasi. Selain itu, tidak ada cara (saya tahu) untuk browser untuk mengembalikan panggilan balik ke aplikasi (terutama lintas platform). Saya tahu beberapa aplikasi yang melakukan itu, tetapi hanya terasa salah dan memberikan istirahat pada aplikasi UX.
Persyaratan
- Pengguna memasukkan nama pengguna / kata sandi ke dalam aplikasi.
- Setiap panggilan API diidentifikasi oleh aplikasi panggilan.
- Overhead dijaga agar tetap minimum dan aspek authtif intuitif untuk pengembang.
- Mekanisme ini aman untuk pengguna akhir (kredensial login mereka tidak diekspos) maupun pengembang (kredensial aplikasi mereka tidak diekspos).
- Jika memungkinkan, tidak memerlukan https (tidak berarti persyaratan sulit).
Pikiran Saya Saat Ini tentang Implementasi
Pengembang eksternal akan meminta akun API. Mereka akan menerima apikey dan apisecret. Setiap permintaan akan membutuhkan minimal tiga parameter.
- apikey - diberikan kepada pengembang saat pendaftaran
- timestamp - berfungsi sebagai pengidentifikasi unik untuk setiap pesan untuk apikey yang diberikan
- hash - hash cap waktu + apisecret
Apikey diperlukan untuk mengidentifikasi aplikasi yang mengeluarkan permintaan. Timestamp bertindak serupa dengan oauth_nonce dan menghindari / mengurangi serangan replay. Hash memastikan bahwa permintaan benar-benar dikeluarkan dari pemilik apikey yang diberikan.
Untuk permintaan terotentikasi (yang dilakukan atas nama pengguna), saya masih ragu-ragu antara pergi dengan rute access_token atau kombo hash nama pengguna dan kata sandi. Apa pun itu, pada suatu titik suatu kombo nama pengguna / kata sandi akan diperlukan. Jadi ketika itu terjadi, hash dari beberapa bagian informasi (apikey, apisecret, timestamp) + kata sandi akan digunakan. Saya suka umpan balik tentang aspek ini. FYI, mereka harus memilah password terlebih dahulu, karena saya tidak menyimpan kata sandi di sistem saya tanpa hashing.
Kesimpulan
FYI, ini bukan permintaan untuk bagaimana membangun / menyusun API secara umum hanya bagaimana menangani otentikasi dan otorisasi hanya dari dalam suatu aplikasi.
Pikiran Acak / Pertanyaan Bonus
Untuk API yang hanya memerlukan apikey sebagai bagian dari permintaan, bagaimana Anda mencegah orang lain selain pemilik apikey untuk dapat melihat apikey (sejak dikirim di tempat yang jelas) dan membuat permintaan berlebihan untuk mendorong mereka melewati batas penggunaan? Mungkin saya hanya memikirkan hal ini, tetapi tidakkah seharusnya ada sesuatu untuk mengotentikasi bahwa permintaan telah diverifikasi kepada pemilik yang benar? Dalam kasus saya, itulah tujuan dari apisecret, tidak pernah ditampilkan / ditransmisikan tanpa hash.
Berbicara tentang hash, bagaimana dengan MD5 vs hmac-sha1? Apakah itu benar-benar penting ketika semua nilai hash dengan data yang cukup panjang (mis. Apisecret)?
Saya sebelumnya telah mempertimbangkan untuk menambahkan garam per pengguna / baris ke hash kata sandi pengguna saya. Jika saya melakukan itu, bagaimana mungkin aplikasi dapat membuat hash yang cocok tanpa mengetahui garam yang digunakan?