winston
winston

Reputation: 3100

The supplied Facebook session token is expired or invalid

I'm trying to implement Facebook login with my Swift app. I was able to login to the app just fine. However, I ran into an issue once I logged the user out. I get the error the supplied Facebook session token is expired or invalid. How can I generate a new token? Here's the code:

      if let accessToken: FBSDKAccessToken = FBSDKAccessToken.currentAccessToken() {
        PFFacebookUtils.logInInBackgroundWithAccessToken(accessToken, block: {
            (user: PFUser?, error: NSError?) -> Void in
            if user != nil {
                print("User logged in through Facebook!")

                self.navigateToInGame(true)

            } else {
                print("Uh oh. There was an error logging in.")

                let manager = FBSDKLoginManager()
                manager.logOut()
                manager.logInWithReadPermissions(["public_profile", "email"], fromViewController: self, handler: { (result, error) -> Void in
                    if let error = error {
                        print(error.localizedDescription)
                    }

                    if result.isCancelled {
                        print("Cancelled")
                    } else {
                        print("Logged in")
                        if let user = user {
                            if user.isNew {
                                print("User signed up and logged in through Facebook!")

                                self.performSegueWithIdentifier("signUp", sender: self)

                            } else {
                                print("User logged in through Facebook!")

                                self.navigateToInGame(true)
                            }
                        } else {
                            print("Uh oh. The user cancelled the Facebook login.")
                        }

                    }
                })

                if accessToken.expirationDate.compare(NSDate()) == NSComparisonResult.OrderedAscending {
                    FBSDKLoginManager.renewSystemCredentials({ (result, error) -> Void in
                        if result != .Renewed {
                            // Do further procedures once renewed is failed or rejected
                            print("Token didn't renew")
                        }
                    })
                }

            }
        })
    } else {
        let permissions = ["public_profile", "email"]
        PFFacebookUtils.logInInBackgroundWithReadPermissions(permissions, block: {
            (user: PFUser?, error: NSError?) -> Void in
            if let user = user {
                if user.isNew {
                    print("User signed up and logged in through Facebook!")

                    self.performSegueWithIdentifier("signUp", sender: self)

                } else {
                    print("User logged in through Facebook!")

                    self.navigateToInGame(true)
                }
            } else {
                print("Uh oh. The user cancelled the Facebook login.")
            }
        })
    }
}

UPDATED CODE.

I get the following in log:

"uh oh, error logging in". Still allows me to login via FB. I click "Continue" in Facebook.

Log reads "logged in"

Log reads "Uh oh, user cancelled the Facebook login and it kicks me back to the login screen. The user, however, is still created in Parse. I would like to go to my signUp segue after signing in for the first time.

Upvotes: 0

Views: 403

Answers (1)

Allen
Allen

Reputation: 1734

if result.isCancelled {
    print("Cancelled")
} else {
    result.token // Your new token is here and throw the token into logInInBackgroundWithAccessToken(:) again
}
//else {
//    print("Logged in")
//    if let user = user {
//        if user.isNew {
//            print("User signed up and logged in through Facebook!")
//            
//            self.performSegueWithIdentifier("signUp", sender: self)
//            
//        } else {
//            print("User logged in through Facebook!")
//            
//            self.navigateToInGame(true)
//        }
//    } else {
//        print("Uh oh. The user cancelled the Facebook login.")
//    }
//    
//}

The part if let user = user { ... } doesn't make sense to me because a new token result.token just got by func logInWithReadPermissions. Therefore, the updated token should be put through PFFacebookUtils.logInInBackgroundWithAccessToken(:) again.

Upvotes: 1

Related Questions