Facebook getLoginStatus解除应用关联后仍返回"connected"问题排查
我已确认Facebook账号不再关联该应用,但调用getLoginStatus仍返回"connected"状态。以下是我使用的代码:
// Load the Facebook SDK asynchronously window.fbAsyncInit = function() { FB.init({ appId : <My App Id>, version : 'v12.0', cookie : true, xfbml : true, status : true }); if ( !ih.data.fb.current_access_token ) { // FB initialized, call getLoginStatus for status FB.getLoginStatus(function(response) { console.log("Got login status, calling handler:", response); statusChangeCallback(response, false); }, true); } };
该调用返回的authResponse如下:
authResponse: accessToken: <An Access Token> data_access_expiration_time: 1686002578 expiresIn: 5111072 graphDomain: "facebook" signedRequest: <A signed request> userID : <My FB Account UserId> loginSource: "facebook" status: "connected"
通过access token调试工具查看,该令牌信息如下:
App ID <My App Id> : <My App Name> Type User App-Scoped User ID <My user Id> : <User Name> User last installed this app via API N/A Issued 1678226578 (20 hours ago) Expires 1683410578 (in about 2 months) Data Access Expires 1686002578 (in about 3 months) Valid True Origin Web Scopes email, pages_show_list, pages_read_engagement, pages_manage_posts, public_profile Granular Scopes pages_show_list <My Page Id> : Test page pages_read_engagement <My Page Id> : Test page pages_manage_posts <My Page Id> : Test page
请问getLoginStatus是否会因账号曾关联过应用就返回"connected"?还是我操作或理解有误?另外,该应用是我的账号所有的测试应用(克隆自我管理的应用),这会不会是问题原因?
getLoginStatus返回connected的核心原因
getLoginStatus的判断逻辑依赖浏览器中存储的Facebook cookie和本地缓存的access_token,并非实时查询Facebook服务器上的应用授权状态。只要本地有未过期的令牌(哪怕你在账号设置里解除了应用关联),SDK就会返回"connected"。即使你加了forceRefresh: true参数,也只是让SDK重新向Facebook请求状态,但如果cookie未清除且令牌外观上未过期,服务器可能仍会返回connected状态,直到令牌被服务器标记无效或过期。操作与理解误区
在Facebook账号设置中解除应用关联,本质是让服务器端作废该令牌,但SDK不会主动检测这个变化。你需要主动验证令牌有效性:比如调用FB.api('/me'),如果令牌已失效,会返回权限错误,这才能真正判断用户是否还授权应用。另外,令牌调试工具显示的"Valid: True"可能是缓存结果,实际该令牌已经无法调用需要用户授权的API。测试应用的影响
克隆的测试应用和原应用独立,但作为应用的开发者/管理员,Facebook可能会保留测试应用的授权状态,不过这不是核心问题,根源还是本地cookie和令牌的缓存机制。解决方法
- 调用
FB.logout()清除本地Facebook登录状态和cookie,之后再调用getLoginStatus会返回"not_authorized"。 - 不要仅依赖
getLoginStatus判断授权状态,拿到令牌后主动调用Graph API验证有效性,根据API返回结果处理用户状态。
- 调用
内容的提问来源于stack exchange,提问作者Andy Wallace

