Codename One中GoogleConnect(含FacebookConnect)令牌变化时的用户识别问题
如何在Codename One的Google/FacebookConnect中识别同一用户
嗨,这个问题其实挺常见的——你遇到的令牌每次变化是完全正常的,因为这些是短期访问令牌,本来就设计成会定期刷新或者每次登录重新生成的,目的是提升安全性。要识别同一用户,你根本不需要依赖令牌,而是要获取并存储用户的永久唯一标识符。
具体步骤如下:
获取用户的唯一ID
不管是GoogleConnect还是FacebookConnect,登录成功后都能从用户的个人资料中拿到一个永久不变的id字段,这个就是用户的唯一标识,不会随登录次数变化。
以GoogleConnect为例,代码实现大概是这样:GoogleConnect gc = GoogleConnect.getInstance(); gc.setClientId("你的客户端ID"); gc.setClientSecret("你的客户端密钥"); gc.setCallbackUrl("你的回调地址"); gc.setScope("profile email"); // 请求获取用户基本资料和邮箱权限 if(gc.doLogin()) { // 登录成功,获取用户资料 Map<String, Object> userProfile = gc.getUserProfile(); String permanentUserId = (String) userProfile.get("id"); // 这个ID永久不变 String userEmail = (String) userProfile.get("email"); // 也可以用邮箱辅助验证 // 这里就可以用permanentUserId来识别用户了 }FacebookConnect的逻辑完全一致,登录成功后调用
getUserProfile()也能拿到id字段,同样是永久唯一的。存储用户的唯一ID
拿到这个唯一ID后,你可以把它存在本地或者自己的服务器上:- 本地存储可以用Codename One的
Storage类:Storage storage = Storage.getInstance(); // 存储用户ID storage.writeObject("savedUserId", permanentUserId); // 下次APP启动时读取 String savedId = (String) storage.readObject("savedUserId"); if(savedId != null) { // 说明是之前登录过的用户,直接关联其账号信息即可 } - 如果有自己的后端服务器,把这个ID和用户在你系统内的账号绑定起来,每次登录后用这个ID查询就能识别用户。
- 本地存储可以用Codename One的
补充说明:为什么令牌会变化
OAuth2协议中的访问令牌本身就是短期有效的(一般几十分钟到几小时),而且每次登录或者刷新令牌时都会生成新的,这是安全设计——就算令牌被泄露,攻击者也只能在短时间内滥用,降低了风险。所以永远不要用令牌来识别用户,唯一可靠的方式是用户的永久ID。
内容的提问来源于stack exchange,提问作者Francesco Galgani
相关产品推荐
相关产品推荐

