Ana sayfaya dön
C#OAuth 2.0Güvenlik

Masaüstü uygulamada Microsoft hesabıyla güvenli giriş

Hazar Akbuz · · 1 dk okuma · Güncellendi

Projects Launcher'a Microsoft hesabıyla girişi eklerken izlediğimiz yol: PKCE, kısa ömürlü yerel dinleyici ve DPAPI ile saklanan oturum.

Projects Launcher, projects.gg ekibi olarak geliştirdiğimiz açık kaynak bir Minecraft başlatıcısı (C#, .NET Framework 4.7.2). Oyuncuların satın aldıkları gerçek hesapla sunuculara çevrim içi modda girebilmesi için başlatıcıya Microsoft hesabıyla giriş ekledik. Akışın tamamı tek bir klasörde duruyor ve ek bir NuGet bağımlılığı yok.

Beş halkalı zincir

  1. Microsoft, OAuth 2.0 + PKCE: kullanıcı Microsoft'un kendi giriş sayfasında oturum açar; başlatıcı yalnız yetkilendirme kodunu alır.
  2. Xbox Live: Microsoft belirteci Xbox Live kimliğine çevrilir.
  3. XSTS: Xbox Live kimliğiyle yetkilendirme belirteci alınır.
  4. Minecraft Services: XSTS belirteciyle oyunun kendi oturum belirteci alınır.
  5. Profil: hesabın Minecraft profili okunur ve oyun bu oturumla başlatılır.

Sorumluluklar dört dosyaya ayrıldı: zincirin kendisi (MicrosoftAuth.cs), oturumu saklayan ve süresi dolan belirteçleri yenileyen katman (PremiumSession.cs), adım adım ilerlemeyi, lisans uyarısını ve hataları gösteren giriş penceresi (PremiumLoginForm.cs) ve Microsoft logosunu görsel dosyaya ihtiyaç duymadan çizen küçük bir sınıf (MicrosoftBrand.cs).

Parolayı hiç görmeyen başlatıcı

Yetkilendirme kodu, rastgele seçilen boş bir portta açılan kısa ömürlü bir yerel dinleyiciyle (loopback) yakalanır. Kullanıcı girişini kendi tarayıcısında, Microsoft'un gerçek sayfasında yapar; başlatıcı parolayı hiçbir aşamada görmez. PKCE sayesinde araya giren biri kodu yakalasa bile onu tek başına belirtece çeviremez.

Oturumu saklamak: DPAPI

Microsoft yenileme belirteci %APPDATA%\.projects\premium.dat dosyasında, Windows DPAPI ile CurrentUser kapsamında şifrelenmiş olarak durur. Dosya başka bir kullanıcı hesabına ya da makineye kopyalanırsa işe yaramaz.

Projeyi çatallayanlar için

Her çatalın kendi Azure uygulaması olmalı. Azure portalında App registrations → New registration adımında desteklenen hesap türü olarak yalnız kişisel Microsoft hesaplarını seçin, yönlendirme adresini Public client/native platformunda http://localhost olarak girin, Allow public client flows seçeneğini açın ve uygulama kimliğini MicrosoftAuth.ClientId alanına yazın. Portalda API izni eklemeye gerek yok: XboxLive.signin offline_access kapsamı giriş anında istenir. İstemci kimliği gizli bir değer değildir.

Kaynak kod ve ayrıntılar: github.com/projects-gg/MinecraftLauncher