Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 即使从Facebook应用程序设置中删除应用程序,用户也可以访问应用程序_Ios_Swift_Facebook Login_Facebook Sdk 4.0 - Fatal编程技术网

Ios 即使从Facebook应用程序设置中删除应用程序,用户也可以访问应用程序

Ios 即使从Facebook应用程序设置中删除应用程序,用户也可以访问应用程序,ios,swift,facebook-login,facebook-sdk-4.0,Ios,Swift,Facebook Login,Facebook Sdk 4.0,我有一个同时使用Parse和FacebookSDK的应用程序。目前遇到的问题是,用户即使在进入其Facebook帐户应用程序设置并从访问其Facebook数据中删除我的应用程序时,仍然能够访问我的应用程序 所以: 1:新用户重新安装。 2:用户通过Facebook登录并访问应用程序注册 3:用户进入Facebook.com>应用程序设置>删除我的应用程序 4:回到iPhone,用户关闭应用程序,重新打开并再次获得访问权限 在这里,我检查用户的当前状态,如果他们持有currentAccessTok

我有一个同时使用Parse和FacebookSDK的应用程序。目前遇到的问题是,用户即使在进入其Facebook帐户应用程序设置并从访问其Facebook数据中删除我的应用程序时,仍然能够访问我的应用程序

所以:
1:新用户重新安装。
2:用户通过Facebook登录并访问应用程序注册
3:用户进入Facebook.com>应用程序设置>删除我的应用程序
4:回到iPhone,用户关闭应用程序,重新打开并再次获得访问权限

在这里,我检查用户的当前状态,如果他们持有
currentAccessToken

override func viewDidLoad() {
    super.viewDidLoad()

    if FBSDKAccessToken.currentAccessToken() != nil{
        moveToNextView() //Segue to next viewController
    }
}
和我的
AppDelegate.swift

import UIKit
import Parse

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {

        Parse.setApplicationId("ID", clientKey:"KEY")
        PFFacebookUtils.initializeFacebookWithApplicationLaunchOptions(launchOptions)
        FBSDKProfile.enableUpdatesOnAccessTokenChange(true)


        return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
    }


    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
    }
}

我猜
currentAccessToken
缓存在应用程序或设备的某个位置,但不确定如何清除/刷新该缓存。

我找到了解决此问题的方法。这并不像人们想象的那么直截了当。Facebook开发者控制台允许您设置取消授权回调URL,可在此处找到:

  • 在Facebook开发者仪表板中选择你的应用程序
  • 单击侧菜单上的Facebook登录
  • 单击设置
  • 然后uou可以提供取消授权的回调URL
  • 每当有人从facebook上删除你的应用程序时,它都会生成一个带有签名请求参数的帖子到你的回调URL。您可以解析已签名的请求以检索用户的facebookid。拥有用户的facebookid后,您可以更新数据库中的记录,以便在下次登录时使用该记录进行检查

    下面是一个PHP示例,说明如何处理取消授权回调

    <?php
    
    function parse_signed_request($signed_request) {
      list($encoded_sig, $payload) = explode('.', $signed_request, 2);
    
      $secret = "appsecret"; // Use your app secret here
    
      // decode the data
      $sig = base64_url_decode($encoded_sig);
      $data = json_decode(base64_url_decode($payload), true);
    
      // confirm the signature
      $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
      if ($sig !== $expected_sig) {
        error_log('Bad Signed JSON signature!');
        return null;
      }
    
      return $data;
    }
    
    
    $signed_request = $_POST['signed_request'];
    $data = parse_signed_request($signed_request);
    $user_id = $data['user_id'];
    
    //now use the user_id to look up your user in your database
    //update a field called deauthorized to true so that you 
    //can check this value upon next login
    
    ?>
    

    希望这能对将来的人有所帮助。

    嗨,凯尔,你能想出解决办法吗?我也面临着同样的问题,我想知道如果浏览器中的内容发生了变化,应用程序将如何得到通知。有趣的是,facebook记录了这一点,在第5点中说“有人通过应用程序设置从facebook删除了你的应用程序,并重新访问了你的应用程序。你的应用程序应该检测到这一点,并提示该人重新登录。”但我不知道当currentAccessToken保持有效时,我们应该如何检测到这一点。如果我能想出如何解决这个问题,我会回来回答这个问题。
    - (void)viewDidLoad
    {
      [super viewDidLoad];
      if ([FBSDKAccessToken currentAccessToken]) {
         // User is logged in, but they may have
         // removed the app so we have to check our 
         // db using a REST API call to see if is deauthorized
    
         // If the user has deauthorized then log them out
         // send them back to the login/signup page
         // if not, carry on as usual
    
         //also don't forget to set the deauthorized value to 0
         //whenever a user successfully logs into facebook
    
      }
    }