一. 前言
登入账号管理,通过结合 EncryptedSharedPreferences 和自动时间戳过期检测,可以有效管理令牌存储和自动注销机制。
-
Token 安全性 :令牌使用
EncryptedSharedPreferences加密存储,以防止被未授权访问。 -
自动注销:每两个月通过检查时间戳实现自动注销,若过期则清除令牌。
-
手动注销:用户可以随时通过按下注销按钮来清除令牌并跳转到登录界面。
二. 编码
根据个人最佳实践建议,以下是关于 token 管理 和 自动注销 的编码示例。我们将使用 SharedPreferences 和 EncryptedSharedPreferences 来存储令牌和过期时间戳,并每两个月自动登出。
2.1 设置 EncryptedSharedPreferences
首先,您需要在 SharedPreferences 中存储敏感数据。为了提高安全性,我们将使用 EncryptedSharedPreferences。
java
import android.content.Context;
import android.content.SharedPreferences;
import androidx.security.crypto.EncryptedSharedPreferences;
import androidx.security.crypto.MasterKeys;
public class TokenManager {
private static final String PREF_NAME = "secure_prefs";
private static final String TOKEN_KEY = "access_token";
private static final String LOGIN_TIMESTAMP_KEY = "login_timestamp";
private static final long AUTO_LOGOUT_PERIOD = 2 * 30 * 24 * 60 * 60 * 1000L; // 2 months in milliseconds
private SharedPreferences sharedPreferences;
public TokenManager(Context context) {
try {
String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
sharedPreferences = EncryptedSharedPreferences.create(
PREF_NAME,
masterKeyAlias,
context,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_GCM,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
} catch (Exception e) {
e.printStackTrace();
}
}
// Save token and login timestamp
public void saveToken(String token) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(TOKEN_KEY, token);
editor.putLong(LOGIN_TIMESTAMP_KEY, System.currentTimeMillis());
editor.apply();
}
// Retrieve token
public String getToken() {
return sharedPreferences.getString(TOKEN_KEY, null);
}
// Retrieve login timestamp
public long getLoginTimestamp() {
return sharedPreferences.getLong(LOGIN_TIMESTAMP_KEY, 0);
}
// Check if token has expired (2 months)
public boolean isTokenExpired() {
long loginTimestamp = getLoginTimestamp();
return System.currentTimeMillis() - loginTimestamp > AUTO_LOGOUT_PERIOD;
}
// Clear token and logout
public void clearToken() {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.remove(TOKEN_KEY);
editor.remove(LOGIN_TIMESTAMP_KEY);
editor.apply();
}
// Check if the user needs to be logged out automatically
public boolean shouldLogoutAutomatically() {
return isTokenExpired();
}
}
2.2 使用 TokenManager 进行登录和注销管理
登录时保存令牌和时间戳
java
TokenManager tokenManager = new TokenManager(this);
// 模拟登录成功后,保存令牌和时间戳
String accessToken = "your_access_token"; // 从服务器获取的令牌
tokenManager.saveToken(accessToken);
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
// 进入主界面
entryWareHouseActivity();
启动时检查是否需要自动注销
java
TokenManager tokenManager = new TokenManager(this);
// 检查令牌是否过期,若过期则执行自动注销
if (tokenManager.shouldLogoutAutomatically()) {
tokenManager.clearToken(); // 清除令牌
Toast.makeText(this, "您的登录已过期,请重新登录", Toast.LENGTH_SHORT).show();
// 跳转到登录界面
navigateToLoginScreen();
}
手动注销
java
TokenManager tokenManager = new TokenManager(this);
// 在用户点击注销按钮时清除令牌
tokenManager.clearToken();
Toast.makeText(this, "注销成功", Toast.LENGTH_SHORT).show();
// 跳转到登录界面
navigateToLoginScreen();
三.总结
本文介绍了一种基于EncryptedSharedPreferences的账号令牌管理方案。通过加密存储令牌和登录时间戳,实现了双重安全机制:自动每两个月检测过期时间强制注销,以及支持用户手动注销功能。代码示例展示了如何创建加密存储、保存/获取令牌、检查过期状态及清除令牌等核心功能。该方案既保障了令牌存储的安全性,又通过定时检测机制增强了账号安全性,同时提供了灵活的手动注销操作。