Apa cara yang tepat untuk menyusun sumber daya yang tenang untuk menyetel ulang kata sandi?
Sumber daya ini dimaksudkan untuk menjadi penyetel ulang kata sandi bagi seseorang yang kehilangan atau lupa kata sandinya. Ini membatalkan kata sandi lama mereka dan mengirimi mereka kata sandi lewat email.
Dua opsi yang saya miliki adalah:
POST /reset_password/{user_name}
atau...
POST /reset_password
-Username passed through request body
Saya cukup yakin permintaannya harus POST. Saya kurang yakin bahwa saya telah memilih nama yang sesuai. Dan saya tidak yakin apakah user_name harus diteruskan melalui URL atau badan permintaan.
sumber
Pengguna yang tidak diautentikasi
Kami melakukan
PUT
permintaan padaapi/v1/account/password
titik akhir dan memerlukan parameter dengan email akun yang sesuai untuk mengidentifikasi akun yang ingin disetel ulang (memperbarui) sandinya oleh pengguna:Catatan: Seperti yang disebutkan @DougDomeny dalam komentarnya, meneruskan email sebagai string kueri di url adalah risiko keamanan. Parameter GET tidak terekspos saat menggunakan
https
(dan Anda harus selalu menggunakanhttps
koneksi yang tepat untuk permintaan semacam itu) tetapi ada risiko keamanan lain yang terlibat. Anda dapat membaca lebih lanjut tentang topik ini di posting blog ini di sini .Meneruskan email di badan permintaan akan menjadi alternatif yang lebih aman daripada meneruskannya sebagai parameter GET:
Badan permintaan:
Tanggapan tersebut memiliki arti tanggapan yang
202
diterima :Pengguna akan menerima email di
[email protected]
dan memproses permintaan pembaruan bergantung pada tindakan yang diambil dengan tautan dari email tersebut.Membuka tautan dari email ini akan mengarahkan ke formulir setel ulang kata sandi pada aplikasi ujung depan yang menggunakan token setel ulang kata sandi dari tautan sebagai input untuk bidang input tersembunyi (token adalah bagian dari tautan sebagai string kueri). Bidang masukan lain memungkinkan pengguna menyetel kata sandi baru. Masukan kedua untuk mengonfirmasi kata sandi baru akan digunakan untuk validasi di front-end (untuk mencegah kesalahan ketik).
Catatan: Dalam email kami juga dapat menyebutkan bahwa jika pengguna tidak menginisialisasi pengaturan ulang kata sandi, dia dapat mengabaikan email dan tetap menggunakan aplikasi secara normal dengan kata sandinya saat ini
Ketika formulir dikirimkan dengan kata sandi baru dan token sebagai input proses reset kata sandi akan berlangsung. Data formulir akan dikirim dengan
PUT
permintaan lagi tetapi kali ini termasuk token dan kami akan mengganti kata sandi sumber daya dengan nilai baru:Badan permintaan:
Tanggapan tersebut akan menjadi tanggapan
204
tanpa kontenPengguna terotentikasi
Untuk pengguna terotentikasi yang ingin mengubah kata sandi mereka,
PUT
permintaan dapat segera dilakukan tanpa email (akun yang kami perbarui kata sandinya diketahui server). Dalam kasus seperti itu, formulir akan mengirimkan dua bidang:Badan permintaan:
sumber
Mari kita tenang sejenak. Mengapa tidak menggunakan tindakan DELETE untuk kata sandi untuk memicu penyetelan ulang? Masuk akal, bukan? Lagi pula, Anda secara efektif membuang kata sandi yang ada demi kata sandi yang lain.
Itu artinya Anda akan melakukan:
Sekarang, dua peringatan besar:
HTTP DELETE seharusnya idempoten (kata mewah untuk mengatakan "bukan masalah besar jika Anda melakukannya beberapa kali"). Jika Anda melakukan hal-hal standar seperti mengirim email "Atur Ulang Kata Sandi", Anda akan mengalami masalah. Anda dapat mengatasi penandaan pengguna / kata sandi ini dengan boolean "Is Reset". Pada setiap penghapusan, Anda mencentang bendera ini; jika tidak diatur maka Anda dapat mengatur ulang kata sandi dan mengirim email Anda. (Perhatikan bahwa memiliki flag ini mungkin memiliki kegunaan lain juga.)
Anda tidak dapat menggunakan HTTP DELETE melalui formulir , jadi Anda harus melakukan panggilan AJAX dan / atau menyalurkan DELETE melalui POST.
sumber
DELETE
cocok di sini. Anda akan mengganti kata sandi dengan kata sandi yang dibuat secara acak, saya kira, jadiDELETE
bisa menyesatkan. Saya lebih sukaCreate (POST) new reset_password action
, di mana kata benda (sumber daya) Anda akan bertindak adalah "tindakan reset_password". Ini juga cocok untuk mengirim email, karena tindakan tersebut merangkum semua detail tingkat bawah ini.POST
tidak idempoten.Seringkali Anda tidak ingin menghapus atau menghancurkan kata sandi pengguna yang ada pada permintaan awal, karena ini mungkin telah dipicu (secara tidak sengaja atau sengaja) oleh pengguna yang tidak memiliki akses ke email. Sebagai gantinya, perbarui token setel ulang sandi pada catatan pengguna dan kirimkan dalam tautan yang disertakan dalam email. Mengklik tautan akan mengonfirmasi bahwa pengguna menerima token dan ingin memperbarui kata sandi mereka. Idealnya, ini juga sensitif terhadap waktu.
Tindakan RESTful dalam kasus ini akan menjadi POST: memicu tindakan create pada pengontrol PasswordResets. Tindakan itu sendiri akan memperbarui token dan mengirim email.
sumber
Saya sebenarnya mencari jawaban, bukan bermaksud memberikan jawaban - tetapi "reset_password" terdengar salah bagi saya dalam konteks REST karena ini adalah kata kerja, bukan kata benda. Meskipun Anda mengatakan Anda sedang melakukan kata benda "reset action" - menggunakan justifikasi ini, semua kata kerja adalah kata benda.
Selain itu, mungkin tidak terpikir oleh seseorang yang mencari jawaban yang sama bahwa Anda mungkin bisa mendapatkan nama pengguna melalui konteks keamanan, dan tidak harus mengirimkannya melalui url atau badan sama sekali, yang membuat saya gugup.
sumber
reset-password
terdengar seperti kata kerja, tetapi Anda dapat dengan mudah membalikkannya (password-reset
) menjadi kata benda. Dan jika Anda telah membuat model aplikasi Anda menggunakan Event Sourcing atau bahkan jika Anda hanya memiliki jenis audit apa pun, masuk akal jika Anda benar-benar memiliki entitas nyata dengan nama ini dan bahkan mungkin mengizinkan GET di atasnya agar pengguna atau administrator dapat melihatnya. sejarah (jelas menutupi teks kata sandi). Tidak membuatku gugup sama sekali. Dan untuk mengambil nama pengguna secara otomatis di sisi server - Anda bisa, tetapi bagaimana Anda menangani hal-hal seperti administrasi / peniruan?reset-password
berhasil menggambarkan efeknya dengan baik.Saya pikir ide yang lebih baik adalah:
Tentang penyediaan data:
Untuk mengatur ulang kata sandi saat ini
Untuk membuat kata sandi baru (setelah reset)
Untuk memperbarui kata sandi (untuk pengguna yang masuk)
sumber
Ada beberapa pertimbangan yang harus diambil:
Penyetelan ulang kata sandi tidak idempoten
Perubahan kata sandi memengaruhi data yang digunakan sebagai kredensial untuk melakukannya, yang akibatnya dapat membatalkan upaya di masa mendatang jika permintaan hanya diulangi kata demi kata sementara kredensial yang disimpan telah berubah. Misalnya, jika token reset sementara digunakan untuk mengizinkan perubahan, seperti yang biasa terjadi dalam situasi kata sandi yang terlupakan, token itu harus kedaluwarsa setelah perubahan kata sandi berhasil, yang sekali lagi membatalkan upaya lebih lanjut untuk mereplikasi permintaan. Jadi pendekatan RESTful untuk perubahan kata sandi tampaknya menjadi pekerjaan yang lebih cocok untuk
POST
daripadaPUT
.ID atau e-mail dalam pemuatan data mungkin berlebihan
Meskipun itu tidak bertentangan dengan REST dan mungkin memiliki beberapa tujuan khusus, seringkali tidak perlu menentukan ID atau alamat email untuk pengaturan ulang kata sandi. Pikirkan tentang itu, mengapa Anda memberikan alamat email sebagai bagian dari data untuk permintaan yang seharusnya melalui otentikasi satu atau lain cara? Jika pengguna hanya mengubah sandi, mereka perlu mengautentikasi untuk melakukannya (melalui nama pengguna: sandi, email: sandi, atau token akses yang disediakan melalui header). Karenanya, kami memiliki akses ke akun mereka dari langkah itu. Jika mereka lupa sandi, mereka akan diberi token reset sementara (melalui email) yang dapat mereka gunakan secara khusus sebagai kredensial untuk melakukan perubahan. Dan dalam kasus ini, otentikasi melalui token seharusnya cukup untuk mengidentifikasi akun mereka.
Mempertimbangkan semua hal di atas, inilah yang saya yakini sebagai skema yang tepat untuk perubahan kata sandi yang tenang:
sumber
POST
vs.PUT
RFC 7231 menentukan bahwa pembaruan parsial dapat dicapai melalui data yang tumpang tindih dari dua sumber daya tetapi dipertanyakan jika sesuatu seperti/v1/account/password
itu benar-benar menggantikan sumber daya yang baik. SepertiPOST
swiss-army-kniff dari Web yang dapat digunakan jika tidak ada metode lain yang layak, mempertimbangkanPATCH
mungkin juga menjadi pilihan untuk menyetel sandi baru.Saya tidak akan memiliki sesuatu yang mengubah sandi dan mengirim mereka yang baru jika Anda memutuskan untuk menggunakan metode / users / {id} / password, dan tetap berpegang pada gagasan Anda bahwa permintaan tersebut adalah sumber dayanya sendiri. yaitu / user-password-request / adalah sumber daya, dan menggunakan PUT, info pengguna harus ada di dalam tubuh. Saya tidak akan mengubah kata sandinya, saya akan mengirim email ke pengguna yang berisi link ke halaman yang berisi request_guid, yang dapat diteruskan bersama dengan permintaan ke POST / user / {id} / password /? Request_guid = xxxxx
Itu akan mengubah kata sandi, dan itu tidak memungkinkan seseorang untuk menyela pengguna dengan meminta perubahan kata sandi.
Ditambah PUT awal bisa gagal jika ada permintaan yang belum selesai.
sumber
Kami Perbarui kata sandi pengguna yang dicatat PUT / v1 / pengguna / kata sandi - identifikasi id pengguna menggunakan AccessToken.
Tidak aman untuk menukar id pengguna. Restful API harus mengidentifikasi pengguna menggunakan AccessToken yang diterima di header HTTP.
Contoh di musim semi-boot
sumber