2015-04-07 18 views
12

Tôi đang tích hợp tích hợp FacebookSDK 4.x với giao diện người dùng tùy chỉnh và sử dụng phương thức sau để đăng nhập và cũng nhận được sự cho phép email từ người dùng.Cách “cho phép lại” quyền sử dụng email bằng Facebook iOS SDK 4.x?

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
    [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
     if (error){ 
      NSLog(@"%@",[error localizedDescription]);    
     } 
     else if (result.isCancelled){ 
      NSLog(@"Cancled"); 
     } 
     else 
     { 
      if ([result.grantedPermissions containsObject:@"email"]) 
      { 
       NSLog(@"Granted all permission"); 
       if ([FBSDKAccessToken currentAccessToken]) 
       { 
        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
        { 
         if (!error) 
         { 
          NSLog(@"%@",result); 
         } 
        }]; 
       } 
      } 
      else 
      { 
       NSLog(@"Not granted"); 
      } 
     } 
    }]; 

Điều này làm việc tuyệt vời trừ khi người dùng từ chối truy cập vào "email". Tôi thấy trong tài liệu FacebookSDK mà tôi có thể yêu cầu lại quyền truy cập vào email của người dùng một lần. Theo các tài liệu FB: như được đưa ra trong này link

If someone has declined a permission for your app, the login dialog won't let your app re-request the permission unless you pass auth_type=rerequest along with your request. 

Kích hoạt Re-authentication

Trong luồng đăng nhập của bạn lựa chọn chúng tôi cho thấy bạn làm thế nào để sử dụng đăng nhập Dialog và OAuth để xác thực một người nào đó và yêu cầu quyền từ chúng. Để xác thực lại, bạn có thể sử dụng các bước tương tự này với thông số bổ sung để ép buộc:

auth_type: tham số này chỉ định xác thực được yêu cầu tính năng (dưới dạng danh sách được phân tách bằng dấu phẩy). lựa chọn hợp lệ là: https - kiểm tra sự hiện diện của một phiên Facebook an toàn và yêu cầu tái thẩm định nếu nó không phải là hiện tại reauthenticate - yêu cầu người đó để xác thực lại vô điều kiện

auth_nonce: includes an app generated alphanumeric nonce which can be used to provide replay protection. See how to check an auth_nonce 

để biết thêm.

Dưới đây là một ví dụ sử dụng SDK Javascript kích hoạt tái xác thực sử dụng một auth_type của reauthenticate:

FB.login (function (response) {// gốc đang FB.login}, {auth_type : 'reauthenticate'})

Lưu ý rằng cơ thể của phản ứng có chứa các tham số auth_type mà bạn chỉ định, ví dụ:

access_token = USER_ACCESS_TOKEN & hết hạn = SECONDS_UNTIL_TOKEN_EXPIRES & auth_type = reauthenticate

Làm thế nào để vượt qua "auth_type = rerequest" đến các máy chủ của Facebook thông qua iOS SDK? Có phương pháp đặc biệt nào cho điều đó không?

Trả lời

15

tôi giải quyết vấn đề bằng cách nhắc lại phương pháp:

[đăng nhập logInWithReadPermissions: @ [@ "email"] handler:^(FBSDKLoginManagerLoginResult * Kết quả, NSError * lỗi)

tôi cần phải vượt qua auth_type: 'rerequest' trong khi yêu cầu lại và tôi nhận được nó trong tài liệu của phương pháp này tôi nhận được mô tả:

Sử dụng phương pháp này khi yêu cầu quyền đọc. Bạn chỉ nên yêu cầu để có quyền khi cần và giải thích giá trị cho người dùng . Bạn có thể kiểm tra result.declinedPermissions để cũng cung cấp thêm thông tin cho người dùng nếu họ từ chối quyền.

Nếu [FBSDKAccessToken currentAccessToken] không phải là số không, nó sẽ là được coi là ủy quyền lại cho người dùng đó và sẽ vượt qua cờ "yêu cầu lại" vào hộp thoại đăng nhập.

chỉ là vấn đề là tôi đã gọi số đăng xuất Phương thức của lớp FbSDKLoginManager. Thao tác này sẽ xóa mã thông báo và nó sẽ coi đó là quyền cũ không được yêu cầu lại.

+0

Tôi gặp vấn đề tương tự, nhưng làm cách nào bạn chuyển auth_type: 'rerequest'? – joels

+3

Thực ra tôi không chuyển 'yêu cầu lại' tới facebook một cách rõ ràng nhưng khi bạn đăng nhập và gọi [login logInWithReadPermissions: @ [@ "email"] handler:^(FBSDKLoginManagerLoginResult * result, NSError * error) một lần nữa nó sẽ lấy làm 'yêu cầu lại'. Vì vậy, chỉ cần nhớ lại phương pháp này sau một thời gian đó là nó có nhưng bạn không phải gọi phương thức đăng xuất trước khi gọi phương thức này là AGAIN. hy vọng nó sẽ giúp bạn :) – Ryuk

+0

vì vậy làm thế nào để làm nhận được email người dùng khi bạn muốn sử dụng nó? – ArdenDev

1

Bạn thực sự không cần phải chuyển hoặc gọi auth_type: rerequest. Điều này đã được thực hiện bởi facebook. Nếu bạn kiểm tra FBSDKLoginManager, mã sẽ làm điều đó cho bạn.

-(NSDictionary *)logInParametersWithPermissions:(NSSet *)permissions 
{ 
    if ([FBSDKAccessToken currentAccessToken]) 
     { 
      loginParams[@"auth_type"] = @"rerequest"; 
     } 
} 
Các vấn đề liên quan