检查 accesstoken 是不是过期 Facebook SDK 4.7 ios

     2023-03-10     29

关键词:

【中文标题】检查 accesstoken 是不是过期 Facebook SDK 4.7 ios【英文标题】:Check if accesstoken is expired Facebook SDK 4.7 ios检查 accesstoken 是否过期 Facebook SDK 4.7 ios 【发布时间】:2016-01-29 06:17:48 【问题描述】:

我正在使用 facebook sdk 4.7,我需要检查 accesstoken 是否已过期。

FBSDKAccessToken *access_token = [FBSDKAccessToken currentAccessToken];
    if (access_token != nil) 
        //user is not logged in

        //How to Check if access token is expired?
        if ([access_token isExpired]) 
            //access token is expired ......
            //
        
    

如果我成功了,我必须再次登录用户。

SDK 提供了一个过期日期。这有什么帮助?该设备可能有错误的日期。

【问题讨论】:

您可以从网络获取当前日期和时间,并根据该日期和时间做出决定。 【参考方案1】:

假设用户之前已经用 Facebook 登录过并且有[FBSDKAccessToken currentAccessToken] != nil(这里我不再赘述,因为通过 FB 登录是另一回事)。

在我的应用中,我执行以下操作以确保 FB 访问令牌始终有效并与我的应用服务器同步。

为简单起见,以下所有代码都在AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // ...

    /** 
        Add observer BEFORE FBSDKApplicationDelegate's 
        application:didFinishLaunchingWithOptions: returns

        FB SDK sends the notification at the time it 
        reads token from internal cache, so our app has a chance 
        to be notified about this.
    */
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(fbAccessTokenDidChange:) 
                                                 name:FBSDKAccessTokenDidChangeNotification 
                                               object:nil];

    return [[FBSDKApplicationDelegate sharedInstance] application: application didFinishLaunchingWithOptions: launchOptions];


- (void)fbAccessTokenDidChange:(NSNotification*)notification

    if ([notification.name isEqualToString:FBSDKAccessTokenDidChangeNotification]) 

        FBSDKAccessToken* oldToken = [notification.userInfo valueForKey: FBSDKAccessTokenChangeOldKey];
        FBSDKAccessToken* newToken = [notification.userInfo valueForKey: FBSDKAccessTokenChangeNewKey];

        NSLog(@"FB access token did change notification\nOLD token:\t%@\nNEW token:\t%@", oldToken.tokenString, newToken.tokenString);

        // initial token setup when user is logged in
        if (newToken != nil && oldToken == nil) 

            // check the expiration data

            // IF token is not expired
            // THEN log user out
            // ELSE sync token with the server

            NSDate *nowDate = [NSDate date];
            NSDate *fbExpirationDate = [FBSDKAccessToken currentAccessToken].expirationDate;
            if ([fbExpirationDate compare:nowDate] != NSOrderedDescending) 
                NSLog(@"FB token: expired");

                // this means user launched the app after 60+ days of inactivity,
                // in this case FB SDK cannot refresh token automatically, so 
                // you have to walk user thought the initial log in with FB flow

                // for the sake of simplicity, just logging user out from Facebook here
                [self logoutFacebook];
            
            else 
                [self syncFacebookAccessTokenWithServer];
            
        

        // change in token string
        else if (newToken != nil && oldToken != nil
            && ![oldToken.tokenString isEqualToString:newToken.tokenString]) 
            NSLog(@"FB access token string did change");

            [self syncFacebookAccessTokenWithServer];
        

        // moving from "logged in" state to "logged out" state
        // e.g. user canceled FB re-login flow
        else if (newToken == nil && oldToken != nil) 
            NSLog(@"FB access token string did become nil");
        

        // upon token did change event we attempting to get FB profile info via current token (if exists)
        // this gives us an ability to check via OG API that the current token is valid
        [self requestFacebookUserInfo];
    


- (void)logoutFacebook

    if ([FBSDKAccessToken currentAccessToken]) 
        [[FBSDKLoginManager new] logOut];
    


- (void)syncFacebookAccessTokenWithServer

    if (![FBSDKAccessToken currentAccessToken]) 
        // returns if empty token
        return;
    

    // BOOL isAlreadySynced = ...
    // if (!isAlreadySynced) 
        // call an API to sync FB access token with the server
    // 


- (void)requestFacebookUserInfo

    if (![FBSDKAccessToken currentAccessToken]) 
        // returns if empty token
        return;
    

    NSDictionary* parameters = @@"fields": @"id, name";
    FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me"
                                                                   parameters:parameters];

    [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
        NSDictionary* user = (NSDictionary *)result;
        if (!error) 
            // process profile info if needed
        
        else 
            // First time an error occurs, FB SDK will attemt to recover from it automatically
            // via FBSDKGraphErrorRecoveryProcessor (see documentation)

            // you can process an error manually, if you wish, by setting
            // -setGraphErrorRecoveryDisabled to YES

            NSInteger statusCode = [(NSString *)error.userInfo[FBSDKGraphRequestErrorHTTPStatusCodeKey] integerValue];
            if (statusCode == 400) 
                // access denied
            
        
    ];

每当您认为是检查 FB 令牌的好时机(例如,某个应用程序在后台运行了一段时间)时,请致电 -requestFacebookUserInfo。这将提交 Open Graph 请求并在令牌无效/过期时返回错误。

【讨论】:

【参考方案2】:

用于检查 facebook 权限..& 授予权限...如果权限存在则自动获取 accesstoken 其他明智的要求登录...

对于斯威夫特

 var login: FBSDKLoginManager = FBSDKLoginManager()
login.logInWithReadPermissions(["public_profile", "email"], handler:  (result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in

  if (error != nil)
  
        //Process error
   
   else if result.isCancelled
   
        //Handle cancellations
   
  else
  
        // If you ask for multiple permissions at once, you
        // should check if specific permissions missing
        if result.grantedPermissions.contains("email")
            //Do work
   
     
   )

对于目标 c:

像这样检查权限。以下代码使用..

if ([[FBSDKAccessToken currentAccessToken]hasGranted:@"email"])
       
          // add your coding here after login call this block automatically.
       
       else
       

    //login code  **//if accesstoken expired...then call this block**

    FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];

    [loginManager logInWithReadPermissions:@[@"public_profile", @"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)




      ];

       

【讨论】:

hasGranted 是否确保访问令牌未过期?能否提供您的信息来源? 如果访问令牌过期,则要求登录

accesstoken已过期

怎么办。。需要重新获取code,然后得到accesstoken。即要重新调用授权界面。需要用refreshtoken刷新accesstoken。关于accesstoken过期的解决办法:是在内层函数中,如果执行失败,并且是access_token过期的异常,则会在request的时候抛出专... 查看详情

检查 JWT 过期是不是足以授权用户?

】检查JWT过期是不是足以授权用户?【英文标题】:IscheckingJWTexpirationenoughtoauthorizeauser?检查JWT过期是否足以授权用户?【发布时间】:2018-03-0622:30:36【问题描述】:我正在学习Angular,并通过检查令牌是否过期看到了很多用户授... 查看详情

检查自动更新订阅是不是过期

】检查自动更新订阅是不是过期【英文标题】:Checkingauto-renewablesubscriptionsforexpiration检查自动更新订阅是否过期【发布时间】:2016-12-2417:35:29【问题描述】:我已经设置了一个沙盒用户,并在我的iPhone设备上成功地为他们订阅了... 查看详情

如何获取accesstoken

  通过用户验证登录和授权,获取AccessToken,为下一步获取用户的OpenID做准备;  同时,AccessToken是应用在调用OpenAPI访问和修改用户数据时必须传入的参数。  accesstoken由每次用户登录时生成,过期时间默认为三个月,用... 查看详情

如何检查密码重置令牌是不是已过期?

】如何检查密码重置令牌是不是已过期?【英文标题】:HowcanIcheckifapasswordresettokenisexpired?如何检查密码重置令牌是否已过期?【发布时间】:2018-03-1209:30:12【问题描述】:我正在使用ASP.NET身份,并且我有基本的忘记密码/重置密... 查看详情

Spring框架如何检查用户帐户是不是过期?

】Spring框架如何检查用户帐户是不是过期?【英文标题】:HowSpringframeworkchecksiftheuseraccountisexpired?Spring框架如何检查用户帐户是否过期?【发布时间】:2017-10-2912:03:41【问题描述】:我可以看到这个html页面:https://docs.spring.io/spri... 查看详情

在加载页面 cakephp 时检查字段天气是不是过期

】在加载页面cakephp时检查字段天气是不是过期【英文标题】:checkfieldweatherexpiredornotwhileloadingapagecakephp在加载页面cakephp时检查字段天气是否过期【发布时间】:2014-07-0711:43:54【问题描述】:以下函数通过将横幅表中的状态字段... 查看详情

获取accesstoken失败啥意思

获取accesstoken失败什么意思需要重新获取code,然后得到accesstoken。即要重新调用授权界面。需要用refreshtoken刷新accesstoken。关于accesstoken过期的解决办法:是在内层函数中,如果执行失败,并且是access_token过期的异常,则会在reques... 查看详情

如何检查 JWT 令牌是不是在 Angular 8 中过期

】如何检查JWT令牌是不是在Angular8中过期【英文标题】:HowtocheckifJWTtokenisexpiredinAngular8如何检查JWT令牌是否在Angular8中过期【发布时间】:2020-06-3015:29:53【问题描述】:在Angular8中检查JWT令牌是否已过期的不同方法。到期时间为1... 查看详情

Spring Security Oauth2:处理过期 AccessToken 的流程

】SpringSecurityOauth2:处理过期AccessToken的流程【英文标题】:SpringSecurityOauth2:FlowtoHandlingExpiredAccessToken【发布时间】:2015-02-0804:11:43【问题描述】:我只是SpringSecurityOauth2的初学者。我尝试制作授权服务器和资源服务器(分离并连... 查看详情

使用 AJAX 检查 PHP 会话是不是存在或过期

】使用AJAX检查PHP会话是不是存在或过期【英文标题】:CheckwhetheraPHPsessionexistsorexpiredusingAJAX使用AJAX检查PHP会话是否存在或过期【发布时间】:2011-08-0118:13:24【问题描述】:如何设置php会话超时,我正在尝试如下,但我认为它不... 查看详情

通过 Instagram API 访问公共 Instagram 内容而不使 accesstoken 过期

】通过InstagramAPI访问公共Instagram内容而不使accesstoken过期【英文标题】:AccessingpublicInstagramcontentviaInstagramAPIwithoutexpiringaccesstoken【发布时间】:2017-04-2019:56:42【问题描述】:我想显示与特定主题标签相关的instagram中的公共内容(... 查看详情

如何在 Quickblox iOS SDK 中检查会话是不是有效或过期?

】如何在QuickbloxiOSSDK中检查会话是不是有效或过期?【英文标题】:HowtocheckwhethersessionliveorexpiredinQuickbloxiOSSDK?如何在QuickbloxiOSSDK中检查会话是否有效或过期?【发布时间】:2014-11-2205:00:49【问题描述】:我知道,在对Quickblox服... 查看详情

如何根据条件更改 DataGridView 的行颜色以检查日期是不是过期

】如何根据条件更改DataGridView的行颜色以检查日期是不是过期【英文标题】:HowtochangearowcolorofDataGridViewbasedonConditiontocheckifDateExpired如何根据条件更改DataGridView的行颜色以检查日期是否过期【发布时间】:2021-10-0811:08:17【问题描... 查看详情

如何检查 JWT 令牌是不是已过期而没有抛出异常?

】如何检查JWT令牌是不是已过期而没有抛出异常?【英文标题】:HowtocheckifaJWTTokenhasexpiredwithoutthrowexceptions?如何检查JWT令牌是否已过期而没有抛出异常?【发布时间】:2021-06-0712:14:27【问题描述】:我正在开发一个Java应用程序... 查看详情

Oauth2;如何解决多个异步 api 调用期间 AccessToken 过期的问题,同时进行?

】Oauth2;如何解决多个异步api调用期间AccessToken过期的问题,同时进行?【英文标题】:Oauth2;HowtosolvetheissuewithexpiredAccessTokenduringmultipleasyncapicalls,madeconcurrently?【发布时间】:2015-08-1023:40:21【问题描述】:我在我的应用程序中使... 查看详情

为啥不推荐使用oauth2accesstoken

参考技术AAccessToken是应用在调用OpenAPI访问和修改用户数据时必须传入的参数。accesstoken由每次用户登录时生成,过期时间默认为三个月,用户再次登录时自动刷新,请网站或应用做好防过期策略,或过期后提示用户再次授权。操... 查看详情

当 accessToken 已过期且客户端需要发送刷新令牌时,应该向客户端发送哪个状态码

】当accessToken已过期且客户端需要发送刷新令牌时,应该向客户端发送哪个状态码【英文标题】:WhichstatuscodeshouldbesenttoclientwhenaccessTokenhasexpiredandtheclientneedstosendrefreshtoken【发布时间】:2022-01-0216:28:16【问题描述】:我正在构建... 查看详情