Facebook 访问令牌在第二次尝试使用 ParseFacebookUtils 登录 Facebook 时为空

Posted

技术标签:

【中文标题】Facebook 访问令牌在第二次尝试使用 ParseFacebookUtils 登录 Facebook 时为空【英文标题】:Facebook access token is null on 2nd attempt of log in with facebook using ParseFacebookUtils 【发布时间】:2017-09-19 17:21:26 【问题描述】:

我在应用程序中使用解析服务器作为后端。我需要使用 Facebook 登录作为注册选项。为此我正在使用

compile 'com.parse:parsefacebookutils-v4-android:1.10.3@aar'

使用这个最新的 Android 版 Facebook sdk

compile('com.facebook.android:facebook-android-sdk:4.26.0') 
        exclude group: 'com.parse.bolts',
                module: 'bolts-android'
    

使用 facebook 安装应用程序后第一次登录时一切正常

private void loginWithFacebook()
        ParseFacebookUtils.logInWithReadPermissionsInBackground(this, Arrays.asList("public_profile", "email", "user_friends"), new LogInCallback() 
            @Override
            public void done(ParseUser user, ParseException err) 
                //....
            
        );
    

我可以将访问令牌与其他信息一起用于稍后在应用程序中用于不同目的,但是当我使用以下方式注销时问题就开始了:

LoginManager.getInstance().logOut();

这个函数让我正常注销,但是在我使用相同的 Facebook 帐户再次登录后,当我调试并尝试获取访问令牌时,它为空,我无法理解为什么它应该可以正常工作。

我用来登录的帐户已经是一个测试帐户,它可以在具有相同流程的 ios 版本的应用程序中正常工作,但在 Android 中却不行。

如果我做错了什么,请告诉我。

【问题讨论】:

这个怎么样?:Facebook SDK 4 for Android - how to log out programmatically 也尝试将 facebook 与应用程序 pastebin.com/TGeYv8BJ 完全分离,但它不起作用。它要求我授予 FB 权限,但登录后访问令牌仍然为空。 您遇到的错误是什么? 事情是在注销并以第二次尝试的读取权限重新登录后,以此类推,使用相同的帐户访问令牌为空。没有收到任何错误。有一个功能可以在分享帖子之前重新登录应用程序以访问发布权限,这会打开 Facebook 对话框,但它说 “无法提供某些权限,需要提交以进行登录审核。” 种类我不应该认为的消息,因为我正在测试的帐户已经是管理员帐户。 您是否在第二次尝试时要求相同的权限 【参考方案1】:

尝试使用this method注销:

ParseUser.logOut()

public static void logOut()

注销当前登录的用户会话。这将从磁盘中删除会话,注销链接服务,并且将来对 ParseUser.getCurrentUser() 的调用将返回 null。 通常,您应该使用 ParseUser.logOutInBackground() 而不是这个,除非您正在管理自己的线程。

注意:由于向后兼容的原因,注销流程中的任何错误都将被吞没。如果您想处理它们,请使用 ParseUser.logOutInBackground()。

我认为您的问题发生是因为您直接使用 Facebook SDK 的 LoginManager.getInstance().logOut() 方法,但 ParseFacebookUtils 缓存了一些有关先前登录的信息。尝试调用:

ParseUser.getCurrentUser().logOut();

顺便说一句,如果你查看 LoginManager.getInstance().logOut() 的代码,你会看到:

/**
 * Logs out the user.
 */
public void logOut() 
    AccessToken.setCurrentAccessToken(null);
    Profile.setCurrentProfile(null);
    setExpressLoginStatus(false);

它将访问令牌设置为 NULL。

人们还建议从应用的 Application 类中删除下一个调用:

ParseUser.enableAutomaticUser();

【讨论】:

ParseUser.getCurrentUser().logOut();它不工作 @KunalK,如果您的代码不是机密的,那么您可以在 gist 上分享它吗?很高兴看到您的 Activity 与登录处理。谢谢!

以上是关于Facebook 访问令牌在第二次尝试使用 ParseFacebookUtils 登录 Facebook 时为空的主要内容,如果未能解决你的问题,请参考以下文章

iOS Facebook 帐户工具包 - 成功登录后第二次打开应用程序时保留用户令牌

Firebase Firestore get() 快照在第二次查询时冻结

jQuery 在第二次单击时删除类并在第二次单击时禁用悬停

AngularJS NgOnInIt 方法在第二次使用路由器链接访问我的组件时丢失数据

电子邮件附件的存储名称 - 第一次运行时出错,但在第二次运行时有效

在单独的模块中,Python getpass 在第二次尝试时工作