Latar Belakang: Saya sudah menulis tumpukan klien dan server untuk OAuth 1.0a dan 2.0.
Baik OAuth 1.0a & 2.0 mendukung otentikasi dua-kaki , di mana server dijamin identitas pengguna, dan otentikasi tiga-kaki , di mana server dijamin oleh penyedia konten identitas pengguna. Otentikasi tiga kaki adalah tempat permintaan otorisasi dan token akses ikut berperan, dan penting untuk dicatat bahwa OAuth 1 juga memilikinya.
Yang kompleks: otentikasi berkaki tiga
Poin utama dari spesifikasi OAuth adalah penyedia konten (mis. Facebook, Twitter, dll.) Untuk memastikan server (misalnya aplikasi Web yang ingin berbicara dengan penyedia konten atas nama klien) bahwa klien memiliki identitas . Apa yang ditawarkan otentikasi tiga kaki adalah kemampuan untuk melakukan hal itu tanpa perlu klien atau server mengetahui detail identitas itu (misalnya nama pengguna dan kata sandi).
Tanpa (?) Terlalu jauh ke detail OAuth:
- Klien mengajukan permintaan otorisasi ke server, yang memvalidasi bahwa klien adalah klien sah dari layanannya.
- Server mengalihkan klien ke penyedia konten untuk meminta akses ke sumber dayanya.
- Penyedia konten memvalidasi identitas pengguna, dan sering meminta izin mereka untuk mengakses sumber daya.
- Penyedia konten mengarahkan kembali klien ke server, memberitahukan keberhasilan atau kegagalan. Permintaan ini mencakup kode otorisasi tentang kesuksesan.
- Server membuat permintaan out-of-band ke penyedia konten dan menukar kode otorisasi untuk token akses.
Server sekarang dapat membuat permintaan ke penyedia konten atas nama pengguna dengan melewati token akses.
Setiap pertukaran (klien-> server, server-> penyedia konten) mencakup validasi rahasia bersama, tetapi karena OAuth 1 dapat melewati koneksi yang tidak terenkripsi, setiap validasi tidak dapat melewati rahasia melalui kabel.
Itu dilakukan, seperti yang telah Anda catat, dengan HMAC. Klien menggunakan rahasia yang dibagikan dengan server untuk menandatangani argumen untuk permintaan otorisasi. Server mengambil argumen, menandatanganinya sendiri dengan kunci klien, dan dapat melihat apakah itu klien yang sah (dalam langkah 1 di atas).
Tanda tangan ini mengharuskan klien dan server untuk menyetujui urutan argumen (jadi mereka menandatangani string yang sama persis), dan salah satu keluhan utama tentang OAuth 1 adalah bahwa ia membutuhkan server dan klien untuk mengurutkan dan tanda tangan secara identik. Ini adalah kode fiddly dan itu benar atau Anda dapat 401 Unauthorized
sedikit bantuan. Ini meningkatkan penghalang untuk menulis klien.
Dengan meminta permintaan otorisasi untuk berjalan di atas SSL, OAuth 2.0 menghapus kebutuhan untuk menyortir dan menandatangani argumen secara bersamaan. Klien meneruskan rahasianya ke server, yang memvalidasinya secara langsung.
Persyaratan yang sama ada di server-> koneksi penyedia konten, dan karena itulah SSL yang menghilangkan satu penghalang untuk menulis server yang mengakses layanan OAuth.
Itu membuat banyak hal lebih mudah dalam langkah 1, 2, dan 5 di atas.
Jadi pada titik ini server kami memiliki token akses permanen yang setara dengan nama pengguna / kata sandi untuk pengguna. Itu dapat membuat permintaan ke penyedia konten atas nama pengguna dengan melewatkan token akses itu sebagai bagian dari permintaan (sebagai argumen kueri, header HTTP, atau data formulir POST).
Jika layanan konten diakses hanya melalui SSL, kami selesai. Jika tersedia melalui HTTP biasa, kami ingin melindungi token akses permanen itu dengan beberapa cara. Siapa pun yang mengendus koneksi akan bisa mendapatkan akses ke konten pengguna selamanya.
Cara yang diselesaikan di OAuth 2 adalah dengan token penyegaran . Token penyegaran menjadi setara kata sandi permanen, dan itu hanya pernah dikirimkan melalui SSL . Ketika server membutuhkan akses ke layanan konten, ia menukar token penyegaran dengan token akses yang berumur pendek. Dengan cara itu semua akses HTTP yang dapat diakses dibuat dengan token yang akan kedaluwarsa. Google menggunakan 5 menit kedaluwarsa pada OAuth 2 API mereka.
Jadi selain dari token penyegaran, OAuth 2 menyederhanakan semua komunikasi antara klien, server, dan penyedia konten. Dan token penyegaran hanya ada untuk memberikan keamanan saat konten sedang diakses tidak dienkripsi.
Otentikasi dua kaki
Namun, terkadang server hanya perlu mengontrol akses ke kontennya sendiri. Otentikasi dua kaki memungkinkan klien untuk mengotentikasi pengguna secara langsung dengan server.
OAuth 2 menstandarkan beberapa ekstensi ke OAuth 1 yang digunakan secara luas. Yang saya tahu paling baik diperkenalkan oleh Twitter sebagai xAuth . Anda dapat melihatnya di OAuth 2 sebagai Kredensial Kata Sandi Pemilik Sumber Daya .
Pada dasarnya, jika Anda dapat mempercayai klien dengan kredensial pengguna (nama pengguna dan kata sandi), mereka dapat bertukar secara langsung dengan penyedia konten untuk token akses. Ini membuat OAuth jauh lebih berguna pada aplikasi seluler - dengan otentikasi tiga kaki, Anda harus menyematkan tampilan HTTP untuk menangani proses otorisasi dengan server konten.
Dengan OAuth 1, ini bukan bagian dari standar resmi, dan mengharuskan prosedur penandatanganan yang sama dengan semua permintaan lainnya.
Saya baru saja mengimplementasikan sisi server OAuth 2 dengan Kredensial Kata Sandi Pemilik Sumber Daya, dan dari sudut pandang klien, mendapatkan token akses menjadi sederhana: meminta token akses dari server, meneruskan id / rahasia klien sebagai header Otorisasi HTTP dan login / kata sandi pengguna sebagai data formulir.
Keuntungan: Kesederhanaan
Jadi dari perspektif implementor, keuntungan utama yang saya lihat di OAuth 2 adalah berkurangnya kompleksitas. Itu tidak memerlukan prosedur penandatanganan permintaan, yang tidak sepenuhnya sulit tetapi tentu saja fiddly. Ini sangat mengurangi pekerjaan yang diperlukan untuk bertindak sebagai klien suatu layanan, yang mana (di dunia mobile modern) Anda paling ingin meminimalkan rasa sakit. Berkurangnya kompleksitas pada server-> penyedia konten membuatnya lebih terukur di pusat data.
Dan itu mengkodifikasikan ke dalam standar beberapa ekstensi untuk OAuth 1.0a (seperti xAuth) yang sekarang digunakan secara luas.