Ketika saya memutuskan untuk mengintegrasikan Steem Keychain dengan , tidak jelas bagi saya bagaimana membangun sesi pengguna dengan server, bagaimana cara memasukkan pengguna. Saya menghabiskan waktu untuk meneliti dan berpikir, jadi saya memutuskan untuk menulis bagaimana saya melakukannya pada akhirnya dan membaginya dengan yang lain.
Menjadi Detektif
Pada awalnya, ketika saya menerapkan otentikasi dengan SteemConnect, situasinya cukup jelas. Anda bertanya SteemConnect dan Anda mendapatkan token yang dapat Anda gunakan untuk memverifikasi identitas Steem pengguna. Tapi tidak ada yang seperti itu dengan Steem Keychain, tidak ada token, belum lagi hanya beberapa metode yang diekspor yang ada pada saat saya mulai memeriksa ekstensi.
Bagaimanapun, ketika membaca sekilas melalui README di GitHub, saya menemukan bagian yang disebut Decode Memo/Verify Key, yang mengatakan bahwa requestVerifyKey dapat digunakan untuk login pengguna. Tidak ada detail lain di sana, jadi meskipun saya tahu apa yang seharusnya saya gunakan, saya tidak tahu apa yang harus dilakukan. Bagaimana cara memverifikasi identitas pengguna di server?
Aliran Otentikasi
Aliran yang saya temukan ternyata lucu bagi saya karena menggabungkan bertukar memo terenkripsi antara server dan aplikasi web seolah-olah mereka sedang melakukan percakapan Steem yang terenkripsi satu sama lain.
Jadi, inilah yang saya dapatkan, selangkah demi selangkah:
- [APP] Minta pengguna untuk memasukkan nama pengguna Steem mereka.
- [APP] Post
namapengguna kelogin / steem_keychain. - [SERVER] Enkripsikan
namapengguna dengan algoritme symetric-key (seperti AES) untuk mendapatkanencrypted_username.Ini membutuhkan rahasia untuk dipersiapkan sebelumnya dan disimpan di server, yang tidak terkait dengan penandatanganan token JWT atau blockchain. - [SERVER] Ambil kunci memo publik pengguna yang diberikan oleh blockchain.
- [SERVER] Enkripsikan
encrypted_usernamemenggunakan kunci memo publik untuk mendapatkanencrypted_memodan mengembalikannya dalam tanggapan. - [APP] Minta Steem Keychain untuk mendekripsi
encrypted_memoyang diterima menggunakan kunci memo pribadi yang tersimpan. - [APP] Posting memo yang didekripsi
(encrypted_username)kelogin / steem_keychain / callback. - SERVER] Dekripsi
encrypted_usernamemenggunakan rahasia pribadi yang tersimpan (AES) untuk mendapatkannama pengguna. - SERVER] Hasilkan token JWT untuk nama pengguna yang diberikan. Kembalikan dalam tanggapan.
- [APP] Simpan token JWT yang dikembalikan. Sesi ini dibuat.
Seperti jelas, seluruh alur bekerja jika pengguna berhasil mendekripsi pesan menggunakan kunci memo pribadi mereka, yang merupakan langkah memverifikasi Steem mengidentifikasi. Aplikasi web tidak dapat mengacaukan apa yang diterima dari server karena dienkripsi dan rahasianya disimpan di server saja.
Alasan mengapa token JWT itu sendiri kembali karena encrypted_memo adalah bahwa kita memerlukan aplikasi web untuk melakukan ping server kembali, membiarkannya tahu bahwa sesi dibuat jika ada logika yang diperlukan untuk dieksekusi.
Jadi apa yang Anda pikirkan? Apakah bisa dilakukan dengan cara yang berbeda atau lebih sederhana?
EDIT: Ada cara yang lebih sederhana ketika menggunakan requestSignBuffer, yang merupakan panggilan API yang tidak tersedia ketika saya menerapkan ini untuk Steeve.
Steem Keychain untuk Angular
Saat menerapkan ini untuk , saya memutuskan untuk mengubah upaya saya menjadi modul Sudut publik yang dapat digunakan siapa saja untuk mulai bekerja dengan Steem Keychain dengan cepat. Semua hujan es ngx-steem-keychain
Note Posting ini di terjemahkan dari posting yang di bagikan oleh dan sudah mendapatkan persetujuan darinya,
merupakan salah satu pengembang Steeve
juga memposting pembaruan secara teratur menggunakan Utopian:
View this post on Steeve