Search code examples
iosswiftparse-platformfacebook-ios-sdklogout

How to Log out from Facebook or revoke login using Parse and Swift


I'm trying to completely log my user out of my app. When using

PFUser.logout()

I successfully log the user out of Parse. But when I come back in the app and click on the login button, I'm redirected to the Facebook screen saying :"You have already authorized [name of the app]" So I can never login again with another account, except if I reset the simulator.

I also tried to logout using

PFFacebookUtils.facebookLoginManager().logOut()

But it doesn't work either... Hope you can help me find a solution to this ! I'm using the latest Facebook and Parse SDK

Update:

Actually using PFUser.logout() and the last versions of Parse and the Facebook iOS SDK version >= 4.4.0 will do the job.

Do not use PFFacebookUtils.facebookLoginManager().logOut() or FBSDKLoginManager().logOut(), because it will only log the user out from Facebook but not from the Parse back-end. Which means that it will not delete the revocable session on the Parse back-end.


Solution

  • Actually there is a difference between Revoking Login (letting people completely de-authorizing an app, or revoking login) and Logging out an user from his/her Facebook account:

    Revoking Login

    (you can check the Facebook documentation)

    You can also let people completely de-authorize an app, or revoke login, by making a call to this Graph API endpoint:

    DELETE /{user-id}/permissions
    

    This request must be made with a valid user access token or an app access token for the current app. If the request is successful, your app receives a response of true. If the call is successful, any user access token for the person will be invalidated and they will have to log in again. Because you're de-authorizing your app, they will also have to grant access to your app as if they were logging in for the first time.

    let facebookRequest: FBSDKGraphRequest! = FBSDKGraphRequest(graphPath: "/me/permissions", parameters: nil, HTTPMethod: "DELETE")
    
    facebookRequest.startWithCompletionHandler { (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
    
                    if(error == nil && result != nil){
                        println("Permission successfully revoked. This app will no longer post to Facebook on your behalf.")
                        println("result = \(result)")
                    } else {
                        if let error: NSError = error {
                            if let errorString = error.userInfo?["error"] as? String {
                                println("errorString variable equals: \(errorString)")
                            }
                        } else {
                            println("No value for error key")
                        }
                    }
    }
    

    Logging out an user form his/her Facebook account

    If you have used Parse and the Facebook iOS SDK version >= 4.4.0 to sign up or log in a user via Facebook, and you do not want to de-authorize an app, or revoke login, but just want to log out the user from Facebook, then please use instead:

    PFUser.logOut()
    

    It will log out the user, delete the session on the Parse back-end side (do not forget to enable Parse revocable session via your Parse app settings), plus it will also delete the Facebook session written on the user device's disk.

    I hope this answer will help you guys.