如何为Facebook Login应用实现新的60/90天登录要求?
嘿,我明白你现在的困惑——Facebook这个令牌政策确实有点绕,尤其是要落地到APP更新上,总怕改得太复杂。我来帮你把这些点拆解清楚,给你一些实际可操作的方案:
先把官方的核心规则理清楚
首先你提到的这两段官方说明是关键,我再帮你划重点:
当您使用iOS、Android或我们的JavaScript SDK时,SDK会确保在90天期限内于令牌过期前完成刷新。使用Facebook SDK的原生移动应用会获得有效期约60天的长期访问令牌。当用户使用您的应用向Facebook服务器发起请求时,这些令牌每天会刷新一次,最长可维持90天。若未发起任何请求,令牌将在约60天后过期,用户需重新完成登录流程以获取新令牌。
在2018年4月9日至21日期间,过去90天内未主动登录您的应用并同意权限的用户,其令牌将会过期。要刷新这些用户令牌,您必须引导用户完成登录流程,且用户需点击“继续”按钮重新确认同意。现在要求每90天重新确认一次同意。
简单说:只要用户每90天内打开过你的APP,SDK会自动帮你刷新令牌;只有用户超过60天没碰过APP,或者是2018年那段时间的过期老令牌,才需要你引导用户重新点个“继续”。
不用全改Graph Request!SDK已经帮你做了大部分工作
你担心要修改所有Graph Request来捕获令牌过期,完全没必要这么折腾!Facebook Android SDK本身内置了令牌自动刷新机制:
- 只要你用SDK提供的方式发起Graph请求(比如
GraphRequest类),SDK会自动检查令牌状态。如果令牌还在60天有效期内,且用户近期用过APP,SDK会静默刷新令牌,你完全感知不到。 - 只有两种情况需要你手动介入:
- 令牌已经超过60天没被刷新(用户60天没打开APP):此时令牌彻底过期,必须引导用户走登录流程(不用重新授权,用户点“继续”确认就行)。
- 用户的令牌是2018年那段政策变更期的过期令牌:这种情况也需要引导用户重新登录确认同意。
关于APP启动时检查令牌的思路
你想在启动时检查令牌是否满60天,这个思路可行,但其实SDK已经帮你做了大部分判断。如果真要做,你可以这么写:
AccessToken accessToken = AccessToken.getCurrentAccessToken(); if (accessToken != null) { // 计算令牌剩余有效期 long remainingTime = accessToken.getExpires().getTime() - System.currentTimeMillis(); // 比如设置阈值为7天,剩余时间不足7天时触发登录流程 if (remainingTime < 7 * 24 * 60 * 60 * 1000) { // 这里触发登录,不过SDK其实会在请求时自动处理,除非令牌真的过期 LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile")); } }
不过要注意:如果令牌还在可刷新期内,SDK会自动刷新,所以这个检查更多是提前预防,不是必须的。
谈谈AccessTokenTracker的作用
你提到的AccessTokenTracker,它确实会在令牌发生变化时触发——不管是令牌被刷新了、过期失效了,还是用户登出了。你可以注册它来监听状态变化:
AccessTokenTracker tokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged(AccessToken oldToken, AccessToken newToken) { if (newToken == null) { // 这里说明令牌彻底失效了(比如超过60天没使用),需要引导用户重新登录 goToLoginScreen(); } else if (!newToken.equals(oldToken)) { // 令牌被成功刷新了,你可以在这里更新本地的令牌相关逻辑(不过SDK已经自动管理了) updateTokenRelatedData(newToken); } } };
划重点:如果令牌还能被自动刷新,newToken会是新的有效令牌,不会是null。只有当令牌完全无法刷新时,newToken才会变成null,这时候你就要引导用户登录了。
关于官方文档的小补充
你说没在Android文档里找到政策变更的更新,其实官方的核心逻辑一直没变:SDK自动处理常规的令牌刷新,只有当令牌彻底过期无法自动刷新时,才需要开发者介入引导登录。所以你不用特意找文档更新,按照现有SDK的最佳实践来就没问题。
另外你提到的Stack Overflow那个问题,核心逻辑和现在的政策是一致的——只要用户每90天内至少打开一次APP,SDK就会帮你维持令牌的有效性。
内容的提问来源于stack exchange,提问作者androidguy

