由于使用Titanium的Facebook模块的无效访问令牌错误而无法登录Facebook。



我正在使用Titanium Studio 3.2.0和Titanium SDK 3.2.0.GA,并在有或没有Facebook应用程序的情况下部署到Android设备。要登录Facebook,我使用的是Titanium提供的。

我遇到了与此链接中描述的相同的问题。当我第一次授权时,来自Facebook的登录事件被启动,没有任何问题。但是,如果我注销,然后尝试再次授权(此时我的应用程序的权限已经被接受,因此理论上它应该触发登录事件),我会在logcat上得到以下错误:

E/FacebookModule( 1584): (main) [11631,11631] LoginDialogListener onFacebookError: Invalid access token.
E/FacebookModule( 1584): com.facebook.android.FacebookError: Invalid access token.
E/FacebookModule( 1584):    at com.facebook.android.Facebook.onSessionCallback(Facebook.java:433)
E/FacebookModule( 1584):    at com.facebook.android.Facebook.access$000(Facebook.java:97)
E/FacebookModule( 1584):    at com.facebook.android.Facebook$2.call(Facebook.java:379)
E/FacebookModule( 1584):    at com.facebook.Session$3$1.run(Session.java:1239)
E/FacebookModule( 1584):    at android.os.Handler.handleCallback(Handler.java:605)
E/FacebookModule( 1584):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/FacebookModule( 1584):    at android.os.Looper.loop(Looper.java:154)
E/FacebookModule( 1584):    at android.app.ActivityThread.main(ActivityThread.java:4624)
E/FacebookModule( 1584):    at java.lang.reflect.Method.invokeNative(Native Method)
E/FacebookModule( 1584):    at java.lang.reflect.Method.invoke(Method.java:511)
E/FacebookModule( 1584):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
E/FacebookModule( 1584):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
E/FacebookModule( 1584):    at dalvik.system.NativeStart.main(Native Method)
E/FacebookModule( 1584): (main) [6,11637] onAuthFail: Invalid access token.

我甚至试图用try/catch来处理这个错误,但即使我将authorize调用放在其中,catch中的代码也没有执行。据我所知,我如何进行授权没有什么异常:

$.LoginButtonHolder.addEventListener('singletap', function(e) {
$.activityIndicator.show();
$.LoginButtonLabel.setOpacity(0);
try
{
fb.authorize();
}
catch(err)
{
// if the authorize call fails, show the error on the console and show the controls to try again
// but these four lines of code never get executed, an unhandled exception is still thrown
Ti.API.info('error in Facebook login');
Ti.API.info(err);
$.activityIndicator.hide();
$.LoginButtonLabel.setOpacity(1);
}
});

经过一番挖掘,我意识到了一些事情,当我第一次尝试授权时,我被重定向到Facebook应用程序,在接受权限后,登录事件会像它应该的那样被触发(作为证据,我得到了一个访问令牌),当我注销时,用于会话的访问令牌会被取消(我在注销事件中检查了它),然后,如果我再次尝试授权,Facebook模块似乎没有获取新的访问令牌,即使我的应用程序已经被允许,它也试图使用无效的令牌,因此抛出了无效访问令牌,尽管这只是我的猜测,我不知道这是否是原因

我该如何解决这个问题?我目前使用的解决方案是通过Graph api调用从我的Facebook用户帐户中删除权限,这不是正确的方法,但这是我再次触发Facebook登录事件的唯一方法。

此外,我检查了我的哈希密钥,它们似乎是有序的,因为我没有收到无效的哈希密钥消息,这里的问题是访问令牌,据我所知,授权调用应该返回一个具有不同到期日的访问令牌,或者我有错主意吗?。

根据这个Facebook开发者链接,当访问令牌过期时,有四种情况,但对于注销情况,我会收到不同的错误消息,显示的错误消息是验证访问令牌时出错:会话无效,因为用户注销了,而我得到的是LoginDialogListener onFacebookError:无效访问令牌。我收到错误消息的原因是什么?

如有任何帮助,我们将不胜感激,提前表示感谢。

当用户注销时,我使用它来清除任何残留的Facebook用户数据,不确定Titanium是如何使用Facebook SDK的,但这是我使用股票FB SDK的方式。

Session.getActiveSession().closeAndClearTokenInformation();

最新更新