Android中AccountManager与dmfs/oauth2-essentials刷新令牌使用问题
解决dmfs/oauth2-essentials刷新令牌与AccountManager Bundle的兼容问题
核心思路很明确:把OAuth2AccessToken对象转成字符串存入Bundle,需要用的时候再把字符串转回对象。下面给你两种实用的实现方式:
方法一:用库自带的序列化能力
dmfs/oauth2-essentials的OAuth2AccessToken本身就支持序列化,不用额外引入工具,直接用就行:
1. 存储令牌到AccountManager
当你首次拿到OAuth2AccessToken后,这样处理:
// 假设已经获取到有效的accessToken对象 String tokenJson = accessToken.toJson(); // 把序列化后的字符串存入Bundle Bundle userData = new Bundle(); userData.putString("saved_access_token", tokenJson); // 调用AccountManager的方法完成存储,比如addAccountExplicitly或者setUserData accountManager.setUserData(account, "token_data", tokenJson);
2. 从Bundle恢复OAuth2AccessToken
需要创建TokenRefreshGrant时,把字符串转回对象:
// 从AccountManager取出存储的JSON字符串 String tokenJson = accountManager.getUserData(account, "token_data"); // 反序列化为可用的OAuth2AccessToken对象 OAuth2AccessToken accessToken = new DefaultOAuth2AccessToken(tokenJson); // 现在就能用这个对象初始化TokenRefreshGrant了 TokenRefreshGrant refreshGrant = new TokenRefreshGrant( yourClientCredentials, accessToken, yourTokenEndpoint );
方法二:用Gson自定义序列化(灵活度更高)
如果库自带的序列化满足不了你的需求,比如有自定义字段,那就用Gson来手动处理:
1. 先添加Gson依赖
确保项目里引入了Gson(如果还没加的话),在build.gradle中添加:
implementation 'com.google.code.gson:gson:2.10.1'
2. 存储令牌
Gson gson = new Gson(); // 把对象转成JSON字符串 String tokenJson = gson.toJson(accessToken); // 存入Bundle和AccountManager Bundle userData = new Bundle(); userData.putString("saved_access_token", tokenJson); accountManager.setUserData(account, "token_data", tokenJson);
3. 恢复令牌
// 取出存储的字符串 String tokenJson = accountManager.getUserData(account, "token_data"); Gson gson = new Gson(); // 把字符串转回OAuth2AccessToken对象 OAuth2AccessToken accessToken = gson.fromJson(tokenJson, DefaultOAuth2AccessToken.class); // 初始化TokenRefreshGrant TokenRefreshGrant refreshGrant = new TokenRefreshGrant( yourClientCredentials, accessToken, yourTokenEndpoint );
额外提醒
- 记得处理序列化/反序列化时的异常,比如JSON解析失败的情况,避免APP崩溃。
- 令牌属于敏感数据,建议加密后再存入AccountManager,提升安全性。
- 如果用自定义的
OAuth2AccessToken实现类,要给字段加上@SerializedName注解,确保Gson能正确映射字段。
内容的提问来源于stack exchange,提问作者Evren Yurtesen
相关产品推荐
相关产品推荐

