Android关于账号令牌Token的管理

一. 前言

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

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone4 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen4 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone4 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui