Mengamankan API REST saya dengan OAuth sambil tetap mengizinkan otentikasi melalui penyedia OAuth pihak ketiga (menggunakan DotNetOpenAuth)

138

Saya memiliki produk dengan REST API langsung sehingga pengguna produk dapat langsung berintegrasi dengan fitur-fitur produk tanpa menggunakan antarmuka pengguna web saya.

Baru-baru ini saya mendapatkan minat dari berbagai pihak ketiga tentang mengintegrasikan klien desktop mereka dengan API untuk memungkinkan pengguna produk saya mengakses data mereka menggunakan aplikasi pihak ketiga itu.

Saya telah melihat bahwa aplikasi yang ingin menggunakan Twitter mengautentikasi menggunakan halaman login yang dihosting oleh Twitter yang memberikan izin aplikasi khusus untuk mengakses data pengguna tersebut. Anda mengklik tombol "Izinkan" atau "Tolak" dan proses otentikasi selesai. Facebook menggunakan mekanisme yang sama dengan yang terbaik yang bisa saya katakan.

Setelah penelitian lebih lanjut, ini tampaknya menjadi OAuth dalam tindakan, dan mengingat API saya berbasiskan. Net, saya pikir saya harus menggunakan DotNetOpenAuth dan menyediakan mekanisme serupa. Sayangnya sampel jarang didokumentasikan (jika ada) dan satu-satunya tutorial yang dapat saya temukan secara online tampaknya difokuskan untuk membantu Anda menyediakan mekanisme login untuk pengguna Anda sehingga mereka dapat masuk ke situs web Anda menggunakan penyedia pihak ketiga.

Apa yang saya akan benar-benar ingin lakukan adalah memiliki saya SISA API menangani semua otentikasi inti dan logika bisnis untuk aplikasi web saya dan memiliki, di bawah tenda, aplikasi web saya pada dasarnya menjadi aplikasi lain yang hanya menggunakan API melalui OAuth. Pengguna akan mengautentikasi di situs web baik secara langsung menggunakan nama pengguna dan kata sandi mereka, atau melalui penyedia pihak ketiga seperti MyOpenID atau Facebook dan kemudian situs web itu entah bagaimana akan menggunakan token yang dikembalikan untuk mengotentikasi terhadap REST API.

Diagram Arsitektur

Pada dasarnya sepertinya saya perlu API saya untuk menghosting layanan OAuth, tetapi juga meminta pengguna menggunakan layanan OAuth pihak ketiga. Saya tidak dapat membantu tetapi berpikir saya tidak memiliki cukup pemahaman tentang OAuth untuk memutuskan apakah saya terlalu rumit atau jika apa yang saya coba lakukan adalah cara yang baik atau buruk untuk melakukan sesuatu.

Dapatkah seseorang memberi saya setidaknya gambaran umum luas tentang langkah-langkah yang perlu saya lakukan, atau apa yang harus saya perhatikan untuk mewujudkannya? Atau tunjukkan saya di beberapa tutorial? Atau hancurkan proposal saya dan katakan bahwa saya salah (secara arsitektur) salah?

Nathan Ridley
sumber
Hai Nathan, saya berjuang dengan skenario yang sama seperti yang Anda jelaskan di sini dan bertanya-tanya apakah Anda memiliki sesuatu untuk ditambahkan ke pertanyaan atau saran saya tentang cara mengatasi kurangnya pemahaman saya saat ini tentang integrasi OpenID dengan API stackoverflow.com/ pertanyaan / 16855131 / ...
Jammer

Jawaban:

123

Pertama saya ingin menekankan perbedaan antara otentikasi dan otorisasi:

Seorang pengguna mengautentikasi ke situs web Anda dengan memberikan beberapa kredensial seperti nama pengguna + kata sandi. OpenID memungkinkan ini untuk dipindahkan dengan meminta pengguna mengotentikasi ke layanan lain, yang kemudian menegaskan identitas pengguna ke situs web Anda atas nama pengguna. Situs Anda mempercayai layanan pihak ketiga (Penyedia OpenID) dan karenanya mempertimbangkan pengguna yang masuk.

Sebuah layanan atau aplikasi tidak mengotentikasi ke situs web Anda - setidaknya tidak biasanya. Seorang pengguna mengotorisasi layanan atau aplikasi untuk mengakses data pengguna. Ini biasanya dilakukan oleh aplikasi yang meminta otorisasi dari penyedia layanan, kemudian mengirim pengguna ke penyedia layanan, di mana pengguna pertama kali mengotentikasi (sehingga penyedia layanan tahu siapa yang berbicara dengan) dan kemudian pengguna mengatakan ke situs "ya, tidak masalah bagi [aplikasi] untuk mengakses data saya [dalam beberapa cara terbatas] ". Sejak saat itu, aplikasi menggunakan token otorisasiuntuk mengakses data pengguna di situs penyedia layanan. Perhatikan bahwa aplikasi tidak mengotentikasi dirinya sendiri seolah-olah itu adalah pengguna, tetapi ia menggunakan kode lain untuk memastikan layanan bahwa ia berwenang untuk mengakses data pengguna tertentu.

Jadi dengan perbedaan yang diklarifikasi, Anda dapat membuat keputusan di situs Anda tentang autentikasi dan otorisasi sepenuhnya secara independen. Misalnya, jika Anda ingin pengguna dapat masuk dengan semua: nama pengguna + kata sandi, OpenID, dan Facebook, Anda dapat melakukannya. Keputusan yang sepenuhnya ortogonal adalah bagaimana Anda mengotorisasi aplikasi (ada banyak protokol yang dapat Anda gunakan untuk ini, OAuth tentu saja menjadi cukup populer).

OpenID berfokus pada otentikasi pengguna . OAuth berfokus pada otorisasi aplikasi . Namun, beberapa layanan seperti Facebook dan Twitter telah memilih untuk menggunakan OAuth untuk otentikasi dan otorisasi daripada menggunakan OpenID untuk otentikasi dan OAuth untuk otorisasi.

Sekarang untuk proyek Anda sendiri, saya sangat menyarankan Anda memeriksa template proyek situs web ASP.NET MVC 2 OpenID (C #) yang tersedia dari Galeri VS. Out of the box hadir dengan otentikasi OpenID dan dukungan Penyedia Layanan OAuth. Ini berarti pengguna Anda dapat masuk dengan OpenID, dan aplikasi serta layanan pihak ketiga dapat menggunakan OAuth untuk melakukan panggilan API ke situs web Anda dan mengakses data pengguna.

Kedengarannya Anda ingin menambahkan ke template proyek ini setelah Anda mulai adalah kemampuan bagi pengguna Anda untuk login dengan nama pengguna + kata sandi serta OpenID. Juga, jika Anda ingin Facebook dan Twitter menjadi pilihan bagi pengguna Anda, Anda harus menerapkannya juga karena mereka tidak menggunakan standar OpenID. Tetapi unduhan DotNetOpenAuth menyertakan sampel untuk masuk dengan Twitter dan Facebook sehingga Anda memiliki beberapa panduan di sana.

Saya menduga Anda tidak akan memiliki banyak hal jika dilakukan di bagian otorisasi. Itu datang dengan OAuth seperti yang saya katakan sebelumnya, dan itu mungkin akan cukup untuk Anda.

Andrew Arnott
sumber
Terima kasih atas jawaban terinci, saya akan memeriksa tautan yang Anda berikan. Untuk klarifikasi, API saya menggantung subdomain situs web saya, jadi secara teknis aplikasi ini tidak sama.
Nathan Ridley
1
Skenario yang tidak biasa di mana aplikasi perlu mengautentikasi dirinya ke server otorisasi daripada pengguna muncul ketika sumber daya dimiliki oleh aplikasi. Misalnya, aplikasi facebook dapat meminta server sumber daya fb untuk wawasan aplikasi dan data statistik yang dikumpulkannya selama periode waktu tertentu. Skenario ini dibahas dalam alur kerja kredensial klien dari OAuth2
SenG
Apakah saya bisa menggunakan REST API tanpa oAuth? @Andrew Arnott
Permata
Tentu saja. Tidak semua API membutuhkan otentikasi sama sekali. Dan oauth bukan satu-satunya mekanisme auth.
Andrew Arnott
11

Pertama-tama. Anda perlu memisahkan secara mental apa API Anda - dari metode otentikasi.

API Anda pada dasarnya adalah sumber daya, dan metode untuk memanipulasi sumber daya itu. Dan Anda dapat memiliki beberapa metode untuk mengautentikasi akses ke API Anda.

OAuth adalah salah satu mekanisme otentikasi tersebut. Menjadi penyedia OAuth bagus, meskipun spesifikasinya agak sulit untuk dipahami, terutama bagian yang berkaitan dengan tanda tangan. Setelah Anda memiliki OAuth, aplikasi klien biasanya memiliki waktu yang mudah untuk mengautentikasi, karena ada begitu banyak "open source, sudah dilakukan, cukup laksanakan" perpustakaan yang tersedia di sebagian besar bahasa.

Pro dan kontra OAuth telah diperdebatkan untuk sementara waktu. Tetapi untuk membentuk pendapat Anda sendiri, saya sarankan untuk membaca panduan definitif ini, yang ditulis oleh Eran Hammer-Lahav , salah satu orang yang bertanggung jawab untuk spesifikasi OAuth.

Satu-satunya alternatif nyata untuk OAuth sejauh yang saya lihat, adalah OAuth 2.0 dan hanya otentikasi dasar sederhana.

Selain itu, Anda berbicara tentang otentikasi menggunakan Open-ID, atau identitas facebook dll. Ini adalah pertanyaan lain yang perlu Anda tanyakan pada diri sendiri. Tapi itu benar-benar berada di luar lingkup API dan OAuth. Bagi saya, itu lebih terasa sebagai pertanyaan tentang pembuatan pengguna di layanan Anda. Saya mungkin salah.

Jon Nylander
sumber
Apakah saya bisa menggunakan REST API tanpa oAuth? @ Jon Nylander
Permata