Flutter/Android对接非Firebase自定义服务端如何实现持久登录功能
自定义服务端持久登录状态实现思路
底层逻辑说明
你之前用的Firebase Auth本质也是这套逻辑,只是它把服务端、本地存储、请求拦截的逻辑都封装好了,你不需要关心底层实现而已。对接自定义服务端只需要自己把这套流程实现一遍即可。
具体落地步骤
服务端侧准备
要求你的服务端提供3个必要接口:- 登录接口:校验用户账号/验证码有效性,校验通过后返回访问令牌(Access Token)、刷新令牌(Refresh Token)、用户基础信息。其中Access Token是短期有效凭证(建议有效期15分钟~2小时),用于所有业务接口的身份校验;Refresh Token是长期有效凭证(建议有效期7~30天),仅用于换发新的Access Token。
- 令牌刷新接口:传入有效的Refresh Token,返回新的Access Token(如果需要也可以同时返回新的Refresh Token做滚动更新)。
- 登出接口:传入Refresh Token,服务端直接作废该令牌,避免被盗用。
客户端本地存储实现
优先选择加密存储方案存敏感凭证,不要用普通非加密持久化:- Flutter端:推荐用
flutter_secure_storage库,Android原生用EncryptedSharedPreferences,iOS原生用系统Keychain。 - 登录成功后,将Access Token、Refresh Token、用户基础信息加密存储到本地。
- Flutter端:推荐用
应用启动状态校验
应用冷启动时,先读取本地存储的Refresh Token:- 读取不到:直接判定为未登录,跳转登录页。
- 读取到:调用令牌刷新接口换发最新的Access Token,换发成功则判定为已登录,直接进入首页;换发失败(令牌过期、被作废)则清空本地所有存储的凭证,跳转登录页。
全局请求拦截处理
封装HTTP请求全局拦截器:- 所有发往服务端的业务请求,自动在请求头添加
Authorization: Bearer <你的Access Token>。 - 当请求返回401状态码(代表身份凭证无效)时,自动暂停所有 pending 的请求,先调用令牌刷新接口:
- 刷新成功:更新本地存储的Access Token,将之前失败的请求用新的Token自动重发,用户无感知。
- 刷新失败:清空本地所有凭证,直接跳转登录页。
- 所有发往服务端的业务请求,自动在请求头添加
登出逻辑处理
用户主动触发登出时,先调用服务端登出接口作废当前Refresh Token,再清空本地所有存储的凭证,跳转登录页即可。
注意事项
- 绝对不要存储用户明文密码到本地,全程只存Token类凭证。
- 必须用加密存储方案存凭证,避免设备Root/越狱后凭证被盗取。
- 不要把Access Token有效期设置过长,就算泄露也能把风险控制在很小的时间范围内。
- 服务端需要支持Refresh Token作废能力,用户改密码、异地登录等风险场景下可以主动作废旧令牌,保障账号安全。
内容的提问来源于stack exchange,提问作者RJB
相关产品推荐
相关产品推荐

