Android关于账号令牌Token的管理

一. 前言

登入账号管理,通过结合 EncryptedSharedPreferences 和自动时间戳过期检测,可以有效管理令牌存储和自动注销机制。

  • Token 安全性 :令牌使用 EncryptedSharedPreferences 加密存储,以防止被未授权访问。

  • 自动注销:每两个月通过检查时间戳实现自动注销,若过期则清除令牌。

  • 手动注销:用户可以随时通过按下注销按钮来清除令牌并跳转到登录界面。

二. 编码

根据个人最佳实践建议,以下是关于 token 管理自动注销 的编码示例。我们将使用 SharedPreferencesEncryptedSharedPreferences 来存储令牌和过期时间戳,并每两个月自动登出。

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的账号令牌管理方案。通过加密存储令牌和登录时间戳,实现了双重安全机制:自动每两个月检测过期时间强制注销,以及支持用户手动注销功能。代码示例展示了如何创建加密存储、保存/获取令牌、检查过期状态及清除令牌等核心功能。该方案既保障了令牌存储的安全性,又通过定时检测机制增强了账号安全性,同时提供了灵活的手动注销操作。

相关推荐
我命由我123452 小时前
Android 多进程开发 - AIDL 回调、RemoteCallbackList、AIDL 安全校验
android·java·安全·android studio·安卓·android-studio·android runtime
黄林晴2 小时前
Android17大屏适配 没得商量了
android
贤泽2 小时前
Android15 ContentProvider 深度源码分析(下)
android·aosp
Kapaseker3 小时前
你搞得懂这 15 个 Android 架构问题吗
android·kotlin
colicode4 小时前
安卓Android语音验证码接口API示例代码:Kotlin/Java版App验证开发
android·java·前端·前端框架·kotlin·语音识别
程序员敲代码吗4 小时前
解析Kotlin中元组的多返回值实现
android·开发语言·kotlin
冬奇Lab15 小时前
应用异常退出实战分析:一次"幽灵杀手"引发的车载系统故障排查
android·性能优化·debug
Ehtan_Zheng19 小时前
如何简化状态和实体映射Kotlin接口,委托和协变泛型
android