Sunting: Setelah memposting ini, saya menyadari bahwa jawabannya hampir sama persis dengan yang diberikan oleh Ali.S (sedikit berbeda tetapi keseluruhan pendekatannya sama.) Awalnya dimulai sebagai sesuatu yang sangat berbeda.
Metode ini mengasumsikan bahwa semua komunikasi ditahan melalui serangkaian terowongan yang aman. Bagaimana Anda mencapai ini tidak masalah. Saya akan menyarankan TLS, tapi itu hanya saya.
- Client => Server Game Klien terhubung ke server game dan memulai sesi login.
- Game Server => Server Auth Server game terhubung ke server auth dan meminta token ID sesi dari server auth. Koneksi ini tetap terbuka untuk mendengarkan keberhasilan / kegagalan login.
- Server Game => Klien Token ID sesi dikirim kembali ke klien.
- Klien => Server Auth Klien mengirim ID sesi ke server auth bersama dengan nama pengguna dan kata sandi pengguna, dan beberapa informasi tentang server (IP, kunci publik TLS, dll. Lihat catatan kaki)
- Auth Server => Server Game Server auth kemudian mengirimkan informasi tentang login ke server game (status keberhasilan, nama pengguna, statistik, dll.) Menggunakan ID sesi yang disediakan oleh klien.
- Server Game => Klien Server game memberi tahu klien bahwa auth berhasil, dan membiarkannya masuk.
- Semua koneksi kecuali klien awal ke koneksi server game sekarang dirobohkan.
Atau, Anda dapat memberikan port khusus untuk server game untuk mendengarkan info masuk. Jika Anda memilih rute ini, maka alirannya akan terlihat seperti ini:
- Klien => Server Auth Klien mengirim nama pengguna, kata sandi, dan IP server ke server auth.
- Auth Server => Server Game + Klien Jika login berhasil, server auth mengirimkan token unik ke server game dan klien. Kirim IP klien ke server game juga, sehingga token tidak dapat dicuri.
- Client => Server Game Klien kemudian mengirimkan token ke server game, yang kemudian diverifikasi dan dihapus di server game. Server game kemudian mengizinkan klien masuk.
Pendekatan kedua ini akan membuat implementasi keseluruhan sedikit lebih mudah.
Catatan kaki:
Alasan saya menentukan bahwa beberapa informasi harus dikirim tentang server game ke server auth adalah untuk memperkeras proses terhadap spoofs. Server dapat memverifikasi informasi untuk memastikan bahwa itu mengotorisasi koneksi yang diharapkan pemain.
ID sesi tidak harus aman secara kriptografis, meskipun itu akan membuat koneksi spoofing menjadi lebih sulit jika memang demikian.
Jika Anda memilih untuk pergi dengan rute TLS, Anda dapat mengatur server penandatanganan yang menandatangani semua sertifikat yang digunakan oleh infrastruktur Anda, dan menambahkannya sebagai CA tepercaya dalam perangkat lunak klien / server. Selama Anda tidak membiarkan sertifikat penandatanganan Anda longgar, Anda akan dapat memberikan beberapa otentikasi yang layak.
Demi memitigasi serangan DoS, buat koneksi habis setelah 20 detik atau kurang. Jika berlangsung lebih lama dari itu, maka ada sesuatu yang salah dan Anda tidak perlu menunggu 3 menit menunggu koneksi ke timeout sendiri.
Klien harus memiliki kunci pribadi dan publik .
Kunci pribadi harus berupa pengidentifikasi unik yang diterima klien dari server otentikasi. Kunci publik juga harus dikirim ke klien.
Sebelum klien terhubung ke server game, ia harus mengirim pesan dengan kunci privat dan ip server game yang ingin dihubungkan, ke server otentikasi. Server otentikasi kemudian harus memverifikasi dan menemukan kecocokan untuk kunci pribadi dan menyimpan kunci publik dalam catatannya.
Server permainan yang disambungkan klien harus mengirim permintaan ke server otentikasi setelah mendapatkan kunci publik dari klien. Jika server otentikasi dapat memverifikasi bahwa klien ingin terhubung ke IP server permainan itu, kirim kembali klien itu. Server game harus memungkinkan klien untuk terhubung.
Kunci pribadi hanya digunakan untuk otentikasi klien sehingga server game tidak mendapatkan id otentikasi asli.
sumber
Ada beberapa solusi yang dapat saya pikirkan, tetapi di sini adalah yang paling aman:
Perhatikan bahwa, dalam skenario ini server game sebenarnya tidak memiliki cara menguping, meskipun seluruh otentikasi melewatinya. karena alasan yang sama ISP Anda tidak dapat memantau paket apa yang Anda kirim ke Facebook, atau berasal dari facebook.
sumber
Cara saya akan melakukan ini adalah dengan meminta token server Auth mengirim ke Klien setelah login bersama dengan daftar server Game yang divalidasi (sehingga Klien dapat memastikan server Game valid).
Kemudian Klien akan mengirim token ke server Game, yang kemudian akan mengirimkannya ke server Auth untuk mengkonfirmasi bahwa ini adalah klien yang valid.
Gabung:
Nanti saat bergabung dengan server Game:
sumber
Bagaimana kalau menandatangani token JWT dengan rahasia yang hanya diketahui pusat dan server pemain? Ini memungkinkan Anda masuk json, yang dapat diverifikasi nanti.
sumber