上一篇
安卓单点登录实现方案
- 行业动态
- 2025-04-24
- 6
基于Token共享机制,客户端存储凭证,服务端验证授权,实现跨应用免密
单点登录原理与核心流程
单点登录(SSO)的核心目标是让用户在多个应用或服务中仅需一次认证即可访问所有关联资源,其实现依赖以下关键组件:
- 认证中心(AS):负责用户身份验证并颁发凭证(如Token)。
- 客户端(App):存储凭证并在后续请求中携带。
- 资源服务器(RS):验证凭证并返回数据。
典型流程:
- 用户输入账号密码 → 认证中心验证 → 返回Token(如JWT)。
- 客户端存储Token → 后续请求携带Token → 资源服务器验证Token并放行。
安卓端实现步骤
集成认证SDK或自定义登录逻辑
- 第三方登录:集成微信、QQ等SDK,调用其登录接口获取临时Token。
- 自定义登录:通过HTTPS向认证中心发送账号密码,换取JWT或OAuth 2.0 Token。
Token存储与管理
存储方式 | 特点 | 推荐场景 |
---|---|---|
SharedPreferences | 轻量,需加密 | 普通应用 |
SQLite | 可扩展,支持复杂查询 | 多账号管理 |
Keystore | 硬件级加密 | 高安全需求 |
示例代码(存储JWT到Secure SharedPreferences):
// 加密存储 SharedPreferences prefs = context.getSharedPreferences("auth", MODE_PRIVATE); prefs.edit().putString("token", token).apply(); // 读取时解密(需自定义加密逻辑) String token = prefs.getString("token", null);
网络请求拦截与Token注入
使用OkHttp
或Retrofit
拦截器自动添加Token到请求头:
// OkHttp拦截器示例 public class TokenInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); String token = getTokenFromStorage(); // 从存储中获取Token if (token != null) { Request modified = original.newBuilder() .addHeader("Authorization", "Bearer " + token) .build(); return chain.proceed(modified); } return chain.proceed(original); } }
服务器端逻辑设计
Token生成与验证
- JWT方案:服务器签发包含用户信息和过期时间的JWT,客户端每次请求携带JWT。
- OAuth 2.0方案:生成Access Token(短期)和Refresh Token(长期),支持Token刷新。
Token刷新机制
触发条件 | 处理方式 |
---|---|
Access Token过期 | 使用Refresh Token申请新Token |
Refresh Token过期 | 强制重新登录 |
示例流程:
- 客户端检测到401错误(Token无效)→ 检查Refresh Token是否有效。
- 若有效,携带Refresh Token请求新Access Token → 更新本地存储。
- 若无效,跳转登录页。
安全加固措施
- 传输安全:强制使用HTTPS,防止中间人攻击。
- 存储加密:对Token进行AES加密后存储,密钥通过Keystore保护。
- 防劫持:绑定设备ID或IP地址到Token,限制跨设备使用。
- 时效性:设置短有效期(如15分钟),降低盗用风险。
常见问题与解决方案对比表
问题 | 错误方案 | 正确方案 |
---|---|---|
Token泄露风险 | 明文存储到文件 | 使用Keystore加密存储 |
多设备登录冲突 | 单一全局Token | 为每个设备生成独立Token |
Token过期体验差 | 直接显示错误页 | 自动刷新或提示重登录 |
相关问题与解答
问题1:如何防止Token被逆向破解?
解答:
- 对Token进行加密存储(如AES+Keystore)。
- 使用混淆工具(如ProGuard)保护代码逻辑。
- 定期更换密钥,缩短Token有效期。
问题2:多应用共享登录状态如何实现?
解答:
- 共享认证中心:所有应用通过同一认证服务器获取Token。
- 跨进程通信:通过ContentProvider或广播机制共享Token。
- WebView方案:嵌入H5页面完成登录,通过JS Bridge传递