2012-10-29 47 views
3

沒有我在讀(FB許多開發文章和SO問題)幫助,所以我想我會在這裏發表。我試圖讓這一切都與iOS 6和Facebook SDK 3.1.1一起工作。的iOS 6的Facebook登錄不刷新訪問令牌

我有一個非常基本的設置:我的iOS應用與Facebook進行身份驗證,我通過到的access_token我的服務器,現在的用戶登錄到我的應用程序。他們唯一能做的與Facebook有關的其他事情是在牆上張貼一些東西。我正在使用傳統的對話窗口,因此用戶可以添加自己的註釋。

一切完美的作品上了一個新安裝的第一個小時左右。如果用戶通過iOS設置應用程序登錄,他們會看到一個快速的iOS確認框,我得到他們的令牌,將它發送到我的服務器,我們都很好。

如果我貼我收到到Facebook的訪問令牌調試令牌,它表明,它會在一個小時內到期。

如果我等待這一個小時,回來到應用程序之後,任何事情我嘗試這樣做給了我這個錯誤:

{"error_code":190," 
    error_msg":"Error validating access token: 
       Session has expired at unix time 1351497600. 
       The current unix time is 1351525180. } 
  1. 什麼,我需要做這樣的事情只是工作? I've read在SDK 3.1.1中,FBSession只會照顧它,但看起來並不是這樣。我的訪問令牌即將過期,一旦這樣做,iOS/FB SDK將不會給我一個刷新的令牌。
  2. 即使註銷(它調用[FBSession.activeSession closeAndClearTokenInformation])不解決這個問題。我能做的唯一事情就是iOS模擬器偏好設置中的「重置內容和設置」,在Settings.app中重新輸入我的FB憑證,然後重建我的應用程序。只有這樣我才能得到另一個令牌,它將在一個小時內過期。

散記:

  1. 當我的應用程序恢復,我打電話[FBSession.activeSession handleDidBecomeActive][self.facebook extendAccessTokenIfNeeded]
  2. 根據鏈接到上面的SO問題,SDK應自動調用FBSession#renewSystemAuthorization。我在裏面放了一個NSLog,我從來沒有看到這個方法被調用。

更新#1

我提到了我讀過的SDK將處理無效/過期的令牌。這似乎應該發生在FBRequestConnection#completeWithResults:orError :.有關代碼路徑的註釋,請參閱行內註釋。

- (void)completeWithResults:(NSArray *)results 
       orError:(NSError *)error 
{ 
    int count = [self.requests count]; 
    for (int i = 0; i < count; i++) { 
     FBRequestMetadata *metadata = [self.requests objectAtIndex:i]; 
     id result = error ? nil : [results objectAtIndex:i]; 
     NSError *itemError = error ? error : [self errorFromResult:result]; 

     id body = nil; 
     if (!itemError && [result isKindOfClass:[NSDictionary class]]) { 
      NSDictionary *resultDictionary = (NSDictionary *)result; 
      body = [FBGraphObject graphObjectWrappingDictionary:[resultDictionary objectForKey:@"body"]]; 
     } 

     ... 

     // ******************************************* 
     // My code actually falls into this block, proving that I do in fact have an invalid session 
     // ******************************************* 
     if ([self isInvalidSessionError:itemError 
         resultIndex:error == itemError ? i : 0]) { 
      [metadata.request.session closeAndClearTokenInformation:itemError]; 

      // ******************************************* 
      // Unfortunately metadata.request.session is nil, so this condition is never 
      // run, so renewySystemAuthorization is never called 
      // ******************************************* 
      if (metadata.request.session.loginType == FBSessionLoginTypeSystemAccount){ 
       [FBSession renewSystemAuthorization]; 
     } 
    } 

    ... 
} 
+0

你確定這是一個長期存取令牌嗎?當您將令牌輸入到[Debugger](https://developers.facebook.com/tools/debug)時,過期日期會說明什麼。我的長壽令牌說「過期:1356716436(大約2個月)」 –

+0

嗯,這很有趣。好主意。將其插入調試器(對於那些不知道的人:https://developers.facebook.com/tools/debug)說:「過期時間:1351540800(大約一個小時)」。我覺得我已經非常仔細地關注了SDK文檔和示例。我的應用程序在第一個小時內運行良好,但在此之後,我無法獲得新的令牌。有任何想法嗎? – djibouti33

+0

您能提供有關您的應用程序儀表板設置的信息嗎?作爲示例,您在「高級」>「身份驗證」部分中的設置如何。還有什麼與您在設置中可以想到的文檔不同? –

回答

7

這不是我以前的修復類型,但事情看起來像預期的那樣工作,所以在這一點上我只需要發貨。

首先,事實證明,我們的應用程序的舊版本正在請求offline_access。我不知道。我進入了我的FB應用程序的設置>高級,並啓用了「刪除offline_access權限」。我現在正在取回持續兩個月的令牌(check out the facbeook token debugger)。

既然我找回了正確的標記類型,在取消激活/過期時我仍然有問題找回有效的標記。由於我現在正在取回2個月的令牌,因此我迫不及待地要過期,所以我的計劃是通過進入我的帳戶設置並取消授權來觸發OAuthException。在我的appDidBecomeActive中,我將[FBRequestConnection startForMeWithCompletionHandler:nil]簡單地觸發一個靜默請求給FB,當由於無效的會話/令牌而失敗時,代碼流將通過正確的路徑運行,[FBSession renewSystemAuthorization]最終被調用,這是我最終需要的。下次我通過FB登錄到我的應用程序時,iOS允許我做的是,iOS再次提示我,理解我沒有有效的標記了。調用[FBSession renewSystemAuthorization]有效地告訴iOS,當我的應用程序下次請求訪問時,打開Facebook並給我一個新的/刷新的令牌。

大多數情況下,一切都按預期工作。

+0

希望我能兩次讚揚這個,謝謝! –

+0

在哪裏找到「FB應用程序的設置>高級,並啓用」刪除offline_access權限。「」我找不到它 – Erik

+0

嗯,看起來像已被刪除。有些搜索顯示它已被棄用/刪除在下個月左右,但也許如果它沒有被啓用,他們只是完全隱藏它,試着跳過這一步,然後跟隨其他步驟,看看你會得到什麼。 – djibouti33