你花了幾十萬做增長,用戶卻在點(diǎn)擊“登錄”按鈕后的第三秒選擇卸載——這不是假設(shè),而是超過20%的首次啟動(dòng)流失正在發(fā)生的環(huán)節(jié)。登錄像一扇安檢門,門太松意味著風(fēng)險(xiǎn)敞口,門太緊意味著用戶被擋在門外。這篇拆解將從你設(shè)計(jì)登錄功能時(shí)必須權(quán)衡的三個(gè)維度出發(fā):會話連續(xù)性、認(rèn)證因子組合、邊緣場景魯棒性。

1. 登錄不是“驗(yàn)證身份一次”,而是開啟一段可信會話

任何登錄功能都不該只被看作一次用戶名/密碼的比對。你需要定義并維護(hù)一個(gè)會話(Session) 的生命周期:從用戶提交憑證,到客戶端持有憑據(jù)進(jìn)行后續(xù)請求,直至憑據(jù)失效或被撤銷。在移動(dòng)端,這個(gè)概念經(jīng)常被“Token 機(jī)制”掩蓋,但核心問題始終相同:你的服務(wù)端如何確認(rèn)下一個(gè) API 請求來自那個(gè)剛剛通過驗(yàn)證的用戶?

1.1 憑據(jù)選擇:不要用“密碼”代言所有登錄

最常見的登錄因子分為三類:

  • 知識因子(你知道什么):密碼、手勢、PIN 碼。
  • 持有因子(你擁有什么):短信驗(yàn)證碼、TOTP 動(dòng)態(tài)碼、硬件密鑰、設(shè)備指紋。
  • 固有因子(你是什么):指紋、面部識別、虹膜。

在一款面向消費(fèi)者的 APP 中,主登錄路徑通常不建議僅依賴單一知識因子。原因很直接:用戶會忘記密碼,會用弱密碼,會在多個(gè)站點(diǎn)復(fù)用密碼導(dǎo)致撞庫風(fēng)險(xiǎn)。你至少需要組合兩類因子作為基礎(chǔ)防線,同時(shí)為高頻使用場景保留“退化的便捷入口”——例如 3D 人臉識別成功后可免密登錄,但云端仍需關(guān)聯(lián)一個(gè)有效期較長的刷新令牌。

1.2 Token 設(shè)計(jì):區(qū)分訪問令牌和刷新令牌

登錄成功后,你通常需要向客戶端下發(fā)兩類令牌:

  • 訪問令牌(Access Token):短期有效(如 15-30 分鐘),直接用于承載 API 請求的鑒權(quán)。推薦使用無狀態(tài) JWT,簽名算法選 RS256 而非 HS256,以便在服務(wù)間分發(fā)公鑰驗(yàn)簽。
  • 刷新令牌(Refresh Token):長期有效(數(shù)天至數(shù)月),用于在訪問令牌過期后靜默獲取新的訪問令牌,避免用戶反復(fù)輸入密碼。

這樣做不是為了追求時(shí)髦,而是因?yàn)槟惚仨毥鉀Q一個(gè)根本矛盾:用戶期望“長期保持登錄”,但你不能讓一個(gè)竊取到短期令牌的攻擊者長期行使權(quán)限。短壽命訪問令牌將暴露窗口壓縮到分鐘級;而刷新令牌可以被服務(wù)端主動(dòng)撤銷,不必等到過期。

// 典型的 Token 下發(fā)響應(yīng)體結(jié)構(gòu)
{
  "access_token": "eyJhbGciOiJSUzI1NiIs...",
  "refresh_token": "b0a4e5c8-9f72-4a1e-8d3e-6c5b4a7f8e2d",
  "expires_in": 1800,
  "token_type": "Bearer"
}

刷新令牌本身不應(yīng)放在本地存儲明文暴露。在移動(dòng)端,你可以將刷新令牌保存在操作系統(tǒng)級的安全存儲中(iOS Keychain / Android EncryptedSharedPreferences 或 Keystore),并對刷新接口施加綁定——檢查請求是否來自與登錄相同的設(shè)備指紋或客戶端證書,降低令牌被導(dǎo)出的風(fēng)險(xiǎn)。

2. 主流登錄方案的選擇判斷:不要為每一種類型都開一個(gè)入口

你面對的不會是“設(shè)計(jì)一個(gè)登錄頁面”那么簡單。更多時(shí)候,你需要決定在你的 APP 中同時(shí)存在幾種登錄路徑,以及它們之間的回退與升級邏輯。

2.1 本機(jī)號碼一鍵登錄

這是移動(dòng)端獨(dú)有的高轉(zhuǎn)化路徑。用戶點(diǎn)擊后,運(yùn)營商網(wǎng)關(guān)通過數(shù)據(jù)網(wǎng)絡(luò)取號,服務(wù)端依據(jù)取號結(jié)果直接建立會話。整個(gè)流程沒有驗(yàn)證碼,沒有密碼,甚至不需要用戶從鍵盤輸入任何東西。

  • 適用場景:強(qiáng)依賴手機(jī)號注冊的 APP,且主流用戶所處網(wǎng)絡(luò)環(huán)境為蜂窩數(shù)據(jù)。
  • 邊界條件:WiFi 環(huán)境下失效、雙卡手機(jī)主卡不匹配、國際漫游不可用、部分虛擬運(yùn)營商號段不支持。你必須在號碼登錄失敗時(shí),立刻降級到短信驗(yàn)證碼或密碼登錄,不能讓界面“卡死”在等待取號上。
  • 實(shí)現(xiàn)關(guān)鍵:取號回來的 token 不能直接用作用戶憑據(jù),需要經(jīng)服務(wù)端調(diào)用運(yùn)營商接口二次驗(yàn)證,同時(shí)將號碼與你的用戶賬號體系關(guān)聯(lián)。切忌在客戶端信任運(yùn)營商 token。

2.2 社交賬號授權(quán)登錄(OAuth 2.0)

“微信登錄”“Apple 登錄”屬于此類。這減少了你保管密碼的責(zé)任,但帶來一個(gè)新的依賴鏈。

  • 必須處理的問題
    1. UnionID 與 OpenID 的差異:如果你在同一開放平臺下有多款 APP,需要 UnionID 做跨應(yīng)用用戶識別,否則用戶會在每款 APP 上生成獨(dú)立賬號。
    2. Apple 登錄的強(qiáng)制要求:如果你已接入其他社交登錄,Apple 要求必須同時(shí)提供 Apple 登錄入口,并優(yōu)先展示。Apple 返回的 email 可能是中繼地址,你需要處理隱私郵箱到真實(shí)郵箱的映射;同時(shí),Apple 允許用戶選擇隱藏真實(shí)郵箱,這時(shí)候你只能依賴于 Apple 返回的不變標(biāo)識符(subject)。
    3. 綁定與合并:用戶在微信登錄后,后續(xù)可能又用手機(jī)號注冊。你需要設(shè)計(jì)“賬號合并”或“綁定”流程,而不是直接創(chuàng)建重復(fù)賬號。一般建議以手機(jī)號為錨點(diǎn),將社交記錄作為可綁定的認(rèn)證源。

2.3 傳統(tǒng)密碼登錄的存留理由

即使在體驗(yàn)上已是次優(yōu)選擇,密碼登錄仍有保留的必要:它是用戶在丟失所有綁定(手機(jī)號、社交賬號)后,通過人工客服恢復(fù)權(quán)限的最后憑據(jù)。你可以將其弱化到“設(shè)置”里的備選項(xiàng),但徹底移除密碼需要法務(wù)評估數(shù)據(jù)歸屬與賬號繼承的合規(guī)風(fēng)險(xiǎn)。

3. 登錄鏈路中你不能忽視的三個(gè)邊界行為

3.1 并發(fā)登錄與設(shè)備管理

你是否允許同一賬號在多臺設(shè)備同時(shí)登錄?如果你的 APP 涉及付費(fèi)內(nèi)容或強(qiáng)隱私信息,建議默認(rèn)策略是“后登錄的設(shè)備擠占前一個(gè)會話”,并在被擠掉的設(shè)備上彈出明確提示:“您的賬號已在另一臺設(shè)備登錄,當(dāng)前會話已退出?!边@不僅僅是安全要求,也是用戶感知控制的體現(xiàn)。若你想允許多設(shè)備登錄(比如視頻類 APP),則需要在設(shè)備管理接口中提供每臺設(shè)備的上次活躍時(shí)間和登錄地點(diǎn),支持用戶主動(dòng)踢出可疑設(shè)備。

3.2 登錄風(fēng)控的動(dòng)態(tài)介入

登錄操作必須在服務(wù)端經(jīng)過風(fēng)險(xiǎn)引擎的預(yù)判。你需要至少采集以下信號:

  • 本次登錄的地理位置與歷史常用地是否跨省/跨國;
  • 登錄時(shí)間是否符合該用戶習(xí)慣作息;
  • 嘗試的密碼錯(cuò)誤次數(shù)、頻率及設(shè)備指紋的變化。

當(dāng)風(fēng)險(xiǎn)引擎返回中高風(fēng)險(xiǎn)等級時(shí),你可以不阻斷登錄,而是追加一次持有因子的挑戰(zhàn),如實(shí)人認(rèn)證、郵箱鏈接認(rèn)證。這種動(dòng)態(tài)多因子(Adaptive MFA)相比一刀切的二次驗(yàn)證,能顯著減少低風(fēng)險(xiǎn)用戶被打斷的次數(shù)。

3.3 網(wǎng)絡(luò)異常與狀態(tài)扭轉(zhuǎn)

登錄不是一個(gè)瞬間動(dòng)作,而是從提交到跳轉(zhuǎn)的臨界區(qū)。你必須假設(shè)用戶在這個(gè)窗口內(nèi)會切換網(wǎng)絡(luò)、電話來電、App 被系統(tǒng)殺死。

  • 冪等性:發(fā)起登錄請求前,客戶端生成一次性的登錄請求 ID。服務(wù)端接收到請求后,根據(jù)該 ID 去重處理。如果客戶端因網(wǎng)絡(luò)超時(shí)不確定服務(wù)端是否已處理,攜帶同一 ID 重試應(yīng)得到相同結(jié)果(不重復(fù)下發(fā)新的刷新令牌)。
  • 超時(shí)保護(hù):取驗(yàn)證碼、第三方登錄回調(diào)、取號等流程必須設(shè)置客戶端和服務(wù)端的雙重超時(shí),一旦超時(shí)立刻釋放等待態(tài)并給予明確失敗反饋,而不是令界面無限旋轉(zhuǎn)。

設(shè)計(jì)登錄功能,歸根結(jié)底是在繪制用戶信任曲線:你需要讓合法用戶在 3 秒內(nèi)確信自己能穩(wěn)定進(jìn)入這個(gè)空間,同時(shí)讓對抗者在盜用路徑上每一步都遭遇可解釋的阻礙。把你的產(chǎn)品中所有登錄入口畫成一張狀態(tài)機(jī)圖,標(biāo)識出每個(gè)狀態(tài)切換時(shí)的數(shù)據(jù)流向和失敗降級策略——這會讓你的決策比“別人家也這么登錄”更扎實(shí),也更可維護(hù)。

← 上一篇 uni-app 開發(fā) APP 的利與弊:從項(xiàng)目生存視角說清真實(shí)取舍 下一篇 → APP 接入微信與支付寶支付的核心路徑與避坑指南