2010-08-31 36 views
13

Tôi đang sử dụng SDK Facebook cho iOS trong ứng dụng của mình: http://github.com/facebook/facebook-ios-sdkcách làm mới mã thông báo oauth khi sử dụng SDK iPhone của Facebook

Mã thông báo oAuth sẽ hết hạn sau khoảng 2 giờ. Làm cách nào để "làm mới" mã thông báo oAuth mà không phải gọi lại phương thức [ủy quyền Facebook ...] - cho phép hiển thị hộp thoại Facebook trống trong thời gian ngắn nếu người dùng đã đăng nhập trước đó? Những gì tôi muốn tránh là yêu cầu người dùng phải đăng nhập lại vào FB mỗi khi họ sử dụng ứng dụng - nói, hàng ngày.

Tôi đã lưu/khôi phục mã thông báo oAuth khi ứng dụng thoát/bắt đầu. Và tôi có thể kiểm tra xem mã thông báo có hợp lệ hay không bằng cách sử dụng [Facebook isSessionValid] hoặc bằng cách kiểm tra thời gian hết hạn trên mã thông báo. Nhưng phải làm gì nếu mã thông báo đã hết hạn? Tôi đã đọc rằng có thể "làm mới" mã thông báo, nhưng tôi không hiểu cách thực hiện điều này.

Tôi không muốn yêu cầu quyền "offline_access", điều này sẽ cung cấp cho tôi mã thông báo "mãi mãi".

Trợ giúp !?

+0

Bạn có muốn tìm câu trả lời cho câu hỏi này không? –

Trả lời

3

thi hành OAuth của Facebook không hỗ trợ làm mới token.

Bạn có 2 loại access_tokens trong Facebook. Mã thông báo ngắn hạn, được cung cấp theo mặc định và mã thông báo dài hạn được cung cấp nếu bạn yêu cầu offline_access. Nếu mã thông báo làm mới được hỗ trợ, nó cũng giống như cung cấp mã thông báo offline_access cho tất cả các ứng dụng. Miễn là người dùng có một phiên facebook hoạt động trên điều khiển web của bạn, bạn có thể yêu cầu access_token mới chỉ bằng cách truy cập https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token hoặc có thể một số lệnh iOS SDK thực hiện tương tự (không bao giờ làm việc với nó để tôi không thể nói). Loại yêu cầu này sẽ không yêu cầu người dùng đăng nhập lại, nhưng sẽ sử dụng phiên trước đó đã được tạo trong lần đăng nhập đầu tiên.

0

Chỉ cần [[phiên FBSession] tiếp tục] nếu nó trả về false, hãy đăng nhập lại

+2

đây là những gì tôi đã từng làm. FB SDK mới nhất trên github đã xóa đối tượng FBSession và tôi không thấy phương thức "tiếp tục" ở bất kỳ đâu. – TomSwift

0

SDK iOS của Facebook không xử lý bộ nhớ phiên. FBSessionDelegate là giao diện gọi lại mà ứng dụng của bạn nên triển khai. các phương thức của nó sẽ được gọi khi đăng nhập hoặc đăng xuất thành công của ứng dụng.

Xem các ứng dụng ví dụ facebook-ios-sdk/sample/DemoApp/Classes/DemoAppViewController.m cho fbDidLogin, fbDidNotLoginfbDidLogout phương pháp

0

Theo tài liệu Facebook SDK:

Các Facebook SDK sẽ tự động làm mới phiên làm việc của người dùng nếu cần thiết. Khi thực hiện điều này, tiểu bang cũng chuyển sang trạng thái FBSessionStateOpenTokenExtended.

Ngoài ra để tiếp tục làm rõ (kể từ phiên bản SDK 3.1):

SDK làm mới phiên tự động các cuộc gọi API.

Nó cũng làm mới dữ liệu mã thông báo khi cần thiết khi xác thực theo dõi hoặc cuộc gọi API Facebook được thực hiện bằng SDK.

+0

Yep; câu hỏi của tôi là một vài năm nay. FBSDK đã phát triển khá nhiều kể từ đó! – TomSwift

+0

Đã tìm kiếm câu trả lời này và chuỗi SO này đã xuất hiện, vì vậy tôi tóm tắt những gì tôi đã nghiên cứu bản thân mình. – lipka

3

Vì không có câu trả lời nào trong số các câu trả lời này thực sự giải quyết câu hỏi tôi sẽ chi tiết cách tôi đã triển khai làm mới mã thông báo OAuth bằng cách sử dụng SDK Facebook.

SDK sẽ tự động làm mới mã thông báo của bạn khi bạn đưa ra yêu cầu, trong trường hợp của chúng tôi, chúng tôi gửi mã thông báo đến máy chủ của chúng tôi và chúng tôi cần sử dụng mã thông báo mới nhất. Vì vậy, khi máy chủ của chúng tôi chỉ ra rằng chúng ta cần thẻ mới đây là những gì chúng tôi làm:

Note Bạn có thể vượt qua AppID vào FBSession hoặc bạn có thể thêm phím FacebookAppID để plist App của bạn (điều này là những gì chúng ta làm) .

- (void)renewFacebookCredentials { 
    if (FBSession.activeSession.state == FBSessionStateOpen || 
     FBSession.activeSession.state == FBSessionStateOpenTokenExtended) { 
     [self sessionStateChanged:[FBSession activeSession] state:[FBSession activeSession].state error:nil]; 
    } else { 
     // Open a session showing the user the login UI 
     // You must ALWAYS ask for public_profile permissions when opening a session 
     [FBSession openActiveSessionWithReadPermissions:@[@"public_profile",@"email"] 
              allowLoginUI:NO 
             completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
              //this block will run throughout the lifetime of the app. 
              [self sessionStateChanged:session state:state error:error]; 
             }]; 
    } 
} 

Các bạn có thể sử dụng sessionStateChanged: phương pháp mà Facebook đưa vào tài liệu của họ nhưng một handler đơn giản trông như thế này:

- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error { 
    // If the session was opened successfully 
    NSString *accessToken; 
    if (!error && state == FBSessionStateOpen && [[session accessTokenData] accessToken]){ 
     // Show the user the logged-in UI 

     //@see http://stackoverflow.com/questions/20623728/getting-username-and-profile-picture-from-facebook-ios-7 
     accessToken = [[session accessTokenData] accessToken]; 
     //Now we have an access token, can send this to the server... 
    } else { 
     //No access token, show a dialog or something 
    } 

    //either call a delegate or a completion handler here with the accessToken 
} 

Hãy nhận biết rằng một số các cuộc gọi FBSession API kiểm tra các chủ đề mối quan hệ vì vậy tôi thấy rằng tôi phải bao gồm tất cả các cuộc gọi FBSession của mình bên trong một số dispatch_async(dispatch_get_main_queue(), ^{...

Các vấn đề liên quan