
【免費下載鏈接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.項目地址https://gitcode.com/GitHub_Trending/ely/Launcher點擊查看免費下載Ely Prism LauncherPineconeMC是一款基于 Prism Launcher 的 Minecraft 啟動器分支為 Ely.by 賬號提供OAuth2 設備碼Device Code登錄。本文逐行解讀核心類ElyDeviceCodeStep的實現幫助你完整理解設備碼登錄流程是如何一步步跑通的。一、什么是 OAuth2 設備碼流程為什么啟動器需要它設備碼流程RFC 8628是為不方便內置瀏覽器登錄的程序設計的啟動器向授權服務器申請一組設備碼 用戶碼用戶打開瀏覽器在官方網頁上輸入用戶碼并登錄啟動器在后臺定時輪詢直到服務器確認用戶已授權授權完成后服務器下發(fā)access_token和refresh_token。這個流程的安全價值在 README.md 中說得非常清楚你的賬號密碼永遠不經過啟動器你只在瀏覽器里登錄 Ely.by 官方頁面啟動器拿到的只是一個權限有限的令牌。這就是 Ely Prism Launcher 相比填賬號密碼式 fork 的最大賣點 。二、代碼結構總覽Ely 版只寫了 34 行設備碼流程的絕大部分邏輯由父類完成Ely 版只需替換三個參數。兩個關鍵文件子類ElyDeviceCodeStep.cpp含頭文件 ElyDeviceCodeStep.h父類MSADeviceCodeStep.cpp// ElyDeviceCodeStep.h class ElyDeviceCodeStep : public MSADeviceCodeStep { public: explicit ElyDeviceCodeStep(AccountData* data); QString describe() override; };父類在 MSADeviceCodeStep.h 中聲明了整套狀態(tài)機成員作用m_clientId/m_scopesOAuth2 客戶端標識與權限范圍m_deviceCodeUrl/m_tokenUrl申請設備碼、換取令牌的端點m_pool_timer輪詢計時器每次到期發(fā)起一次令牌請求m_expiration_timer一次性到期計時器超時自動中止interval輪詢間隔默認 5 秒可被服務器動態(tài)調整三、構造函數逐行解讀Ely 專屬的 3 個參數ElyDeviceCodeStep.cpp 的構造函數只有 4 行卻完成了從微軟切換到 Ely的全部工作ElyDeviceCodeStep::ElyDeviceCodeStep(AccountData* data) : MSADeviceCodeStep(data) { m_clientId APPLICATION-getElyClientID(); m_scopes account_info offline_access minecraft_server_session; m_deviceCodeUrl QUrl(https://account.ely.by/api/oauth2/v1/devicecode); m_tokenUrl QUrl(https://account.ely.by/api/oauth2/v1/token); }逐行拆解m_clientId APPLICATION-getElyClientID()讀取 Ely 平臺的 Client ID。實現見 Application.cpp——優(yōu)先取用戶設置里的ElyClientIDOverride否則用編譯期常量BuildConfig.ELY_CLIENT_ID。m_scopes權限范圍與微軟的XboxLive.SignIn不同Ely 申請的是三個 scope——account_info讀取賬號信息、offline_access允許頒發(fā) refresh_token實現離線續(xù)期、minecraft_server_session加入服務器會話的憑證。兩個 URL指向 Ely 自己的 OAuth2 端點而不是login.microsoftonline.com父類默認值。最后 describe() 只是把進度條文案改成Logging in with Ely.by account(device code).讓用戶明確當前登錄的是 Ely 通道。四、perform()向服務器申請設備碼父類的 perform() 是流程的起點QUrlQuery data; data.addQueryItem(client_id, m_clientId); data.addQueryItem(scope, m_scopes); auto payload data.query(QUrl::FullyEncoded).toUtf8();要點有三表單編碼請求以application/x-www-form-urlencodedPOST 到m_deviceCodeUrl只帶client_id和scope兩個參數——此時還不需要任何用戶憑證。網絡層封裝通過Net::Upload::makeByteArray創(chuàng)建請求用RawHeaderProxy附加請求頭并enableAutoRetry(true)讓傳輸層自動重試。任務化執(zhí)行請求被包進NetJob命名MSADeviceCodeStep完成后回調 deviceAuthorizationFinished()。五、deviceAuthorizationFinished()解析響應彈出登錄頁服務器響應是一個 JSON被解析為 DeviceAuthorizationResponse 結構device_code / user_code / verification_uri / expires_in / interval處理邏輯按順序做了四件事雙重校驗先檢查 HTTP 層是否成功、JSON 中是否帶error字段再確認device_code、user_code、verification_uri、expires_in四項必填字段齊全缺任何一項都以STATE_FAILED_HARD終止。通知界面emit authorizeWithBrowser(verification_uri, user_code, expires_in)。信號沿 AuthFlow.cpp 中建立的連接冒泡到 MSALoginDialog.cpp 的authorizeWithBrowserWithExtra()——它把用戶碼顯示為等寬字體文本、提供一鍵復制按鈕并用qrencode現場繪制出驗證頁的二維碼掃碼即可登錄 。啟動到期計時器m_expiration_timer設為一次性、時長expires_in秒超時直接調用 abort() 停止一切并報錯。啟動輪詢計時器調用startPoolTimer()進入等待狀態(tài)。一個精妙細節(jié)在 startPoolTimer()如果到期剩余時間已不足一個輪詢間隔它會重新調用perform()申請一組新的設備碼避免輪詢一次都沒發(fā)出去碼就過期了的邊界情況。六、輪詢機制authorization_pending 與 slow_down 的優(yōu)雅處理每過interval秒authenticateUser() 向m_tokenUrl提交grant_type urn:ietf:params:oauth:grant-type:device_code device_code 上一步拿到的設備碼authenticationFinished() 對五種結果分別處置完全遵循 RFC 8628 §3.5服務器/網絡反饋處理方式authorization_pending用戶還沒在瀏覽器完成登錄 → 按原間隔繼續(xù)輪詢slow_down服務器嫌輪詢太快 →間隔 5 秒后繼續(xù)連接超時指數退避interval * 2防止雪崩式重試其他請求失敗不增加間隔立即再試一次其他error判定失敗STATE_FAILED_HARD終止流程注意輪詢重試復用的是m_request而非NetJob且只在拿到成功令牌時才stop()到期計時器——任何一次失敗都不會讓流程誤判為結束。七、登錄成功token 寫入 AccountData 的 5 個字段拿到令牌后代碼只寫入了 AccountData.h 中Token結構的幾個字段m_data-msaClientID m_clientId; // 記錄是哪個客戶端拿的 token m_data-msaToken.issueInstant 當前UTC時間; // 頒發(fā)時間 m_data-msaToken.notAfter 當前時間 rsp.expires_in; // 過期時間 m_data-msaToken.refresh_token rsp.refresh_token; // 離線續(xù)期用 m_data-msaToken.token rsp.access_token; // 主令牌隨后以STATE_WORKING狀態(tài)發(fā)出finished(Got MSA token)——注意這里不算流程結束只是本步驟完成接下來交給上層編排。八、上層編排AuthFlow 如何串起 4 個步驟AuthFlow.cpp 根據AccountType和登錄動作裝配步驟鏈。Ely 賬號 設備碼登錄時隊列是ElyDeviceCodeStep—— 本文主角拿到 Ely 平臺的 OAuth2 令牌ElyYggdrasilTokenStep—— 把令牌換成 YggdrasilMinecraft 服務器側令牌MinecraftProfileStepEly—— 拉取游戲檔案玩家名、UUIDGetSkinStep—— 下載皮膚數據。AuthFlow::nextStep() 每次取出隊首步驟執(zhí)行靠AuthStep::finished信號驅動下一步任何一步進入失敗狀態(tài)STATE_FAILED_HARD等都會通過 changeState() 把賬號標記為Expired/Errored并終止整條鏈。九、安全模型小結為什么設備碼登錄更放心 ?密碼零接觸整個 ElyDeviceCodeStep.cpp 中不存在任何密碼字段憑據交換發(fā)生在瀏覽器與 Ely.by 之間。權限最小化scope 限定為account_info offline_access minecraft_server_session啟動器拿不到超出登錄 Minecraft 所需的能力。令牌可隨時撤銷失效的只有令牌而非賬號密碼本身到期由refresh_token靜默續(xù)期體驗與安全性兼得。十、小結一張圖看懂完整生命周期構造(替換 clientId/scopes/URL) ↓ perform() ──POST client_idscope──→ account.ely.by/devicecode ↓ deviceAuthorizationFinished()校驗 → 彈碼二維碼 → 起雙計時器 ↓ 循環(huán)輪詢 authenticateUser()pending→繼續(xù) / slow_down→5s / 超時→退避 ↓ authenticationFinished()成功 → 寫入 msaToken → STATE_WORKING ↓ AuthFlow 繼續(xù)執(zhí)行 Yggdrasil 令牌 → 檔案 → 皮膚ElyDeviceCodeStep本體只有 34 行代碼真正的工作由父類 MSADeviceCodeStep.cpp 的狀態(tài)機完成——這種模板方法模式讓 MSA 與 Ely 兩條登錄通道共享同一套輪詢、退避與超時邏輯是理解本項目 OAuth2 認證體系的最佳入口。贊分享【免費下載鏈接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.項目地址https://gitcode.com/GitHub_Trending/ely/Launcher點擊查看免費下載相關推薦Ely Prism Launcher認證流程源碼解析AuthFlow多步驟編排完整走讀Ely Prism Launcher認證流程源碼解析AuthFlow多步驟編排完整走讀 Ely Prism Launcher 是基于 Prism Launch為什么Ely Prism Launcher登錄時看不到你的密碼Ely.by OAuth2安全設計原理為什么Ely Prism Launcher登錄時看不到你的密碼Ely.by OAuth2安全設計原理 使用 Ely Prism Launcher 登錄 ElyEly Prism Launcher實例數據模型MinecraftInstance與BaseInstance完整解讀Ely Prism Launcher實例數據模型MinecraftInstance與BaseInstance完整解讀 Ely Prism Launcher 是創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考