how to refresh an oauth token when using the Facebook iPhone SDK

前端 未结 6 2005
被撕碎了的回忆
被撕碎了的回忆 2021-02-04 07:18

I\'m using the Facebook SDK for iOS in my app: http://github.com/facebook/facebook-ios-sdk

The oAuth token expires after about 2 hours. How can I \"refresh\" the oAuth

6条回答
  •  逝去的感伤
    2021-02-04 08:00

    As of today Facebook is supposed to refresh tokens automatically, requests to GraphAPI can be done without providing token string either (Facebook handles it under the hood).

    Moreover, if it happens that user wasn't using app for a long time and his token managed to expire, on your next request to Graph API an alert will be shown by Facebook's SDK asking user to relogin (all that is handled by Facebook and when done - will return into FBSDKGraphRequest's closure).

    However, if someone really has a reason to manually refresh access token, here's an example (Swift 4):

    private var selfDestructableNotificationToken: NotificationTokenThatAutomaticallyRemovesObserver?
    final class NotificationTokenThatAutomaticallyRemovesObserver: NSObject { // more info here: https://oleb.net/blog/2018/01/notificationcenter-removeobserver/
        let token: Any
        init(_ token: Any) { self.token = token }
        deinit { NotificationCenter.default.removeObserver(token) }
    }
    
    ...
    
    if let currentFBToken = FBSDKAccessToken.current() { // if this is a Facebook user, not an email-based user
        if FBSDKAccessToken.currentAccessTokenIsActive() { // and his token has not expired yet
            let token = NotificationCenter.default.addObserver(forName: NSNotification.Name.FBSDKAccessTokenDidChange, object: nil, queue: OperationQueue.main) { notification in
                if let userInfo = notification.userInfo, let refreshedToken = userInfo["FBSDKAccessToken"] as? FBSDKAccessToken {
                    self.fbAccessToken = refreshedToken.tokenString
                } else {
                    self.fbAccessToken = currentFBToken.tokenString // falling back to using an old token (better than none)
                }
            }
            self.selfDestructableNotificationToken = NotificationTokenThatAutomaticallyRemovesObserver(token)
            FBSDKAccessToken.refreshCurrentAccessToken { _, _, error in
                if let error = error {
                    print("failed to refresh Facebook token with error \(error.localizedDescription)")
                    self.fbAccessToken = currentFBToken.tokenString // falling back to an old token (better than none)
                }
            }
        } else if FBSDKAccessToken.current().isExpired { // unlucky user. Probably returned to the app after > 2 months break
            self.fbAccessToken = currentFBToken.tokenString // assigning expired token. Facebook will ask user to relogin as soon as we call Graph API with that expired token
        }
    }
    

提交回复
热议问题