Quản lý quyền trên iOS

Trong quá trình đăng nhập cơ bản, ứng dụng của bạn sẽ nhận được quyền truy cập vào trang cá nhân công khai của một người. Để truy cập các thông tin khác trên trang cá nhân hoặc thay mặt người đó đăng nội dung lên Facebook, bạn cần yêu cầu cấp thêm quyền. Hãy xem phần Quyền khi Đăng nhập bằng Facebook.

Ứng dụng của bạn nên quản lý các quyền như sau:

  • Yêu cầu API Đồ thị – Trước khi gửi yêu cầu API Đồ thị, bạn nên kiểm tra các quyền cần thiết và yêu cầu cấp các quyền đó nếu cần.

  • Thiếu quyền và quyền bị thu hồi – Ứng dụng của bạn cần xử lý các lỗi thiếu quyền hoặc quyền bị thu hồi từ Facebook, chẳng hạn như bằng cách yêu cầu cấp quyền rồi thử lại. Hãy xem phần Xử lý lỗi, iOS SDK.

  • Yêu cầu đúng lúc – Bạn sẽ đạt được lượt chuyển đổi tốt hơn nếu chỉ yêu cầu cấp quyền khi cần và cung cấp chức năng mà không đòi hỏi tất cả các quyền.

Yêu cầu khi đăng nhập

Để yêu cầu cấp quyền khi đăng nhập bằng FBSDKLoginButton, hãy đặt thuộc tính permissions :

let loginButton = FBLoginButton()
loginButton.permissions = ["public_profile", "email"]

Nếu đang sử dụng một nút đăng nhập tùy chỉnh thay cho FBSDKLoginButton, bạn có thể sử dụng LoginManager để thực hiện đăng nhập:

override func viewDidLoad() {
    super.viewDidLoad()

    ...
    loginButton.addTarget(self, action: #selector(loginButtonClicked), for: .touchUpInside)  
}
  
@objc func loginButtonClicked() {
    let loginManager = LoginManager()
    loginManager.logIn(permissions: ["email"], from: self) { result, error in
        // Process result or error
    }
}

Bạn nên kiểm tra xem mã hiện tại có dùng được hay không trước khi gọi loginManager. Hãy xem phần Đăng nhập bằng Facebook dành cho iOS

Kiểm tra quyền

Để kiểm tra các quyền hiện tại, hãy kiểm tra FBSDKAccessToken.

if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"email"]) {
  // TODO: publish content.
} else {
  FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
  [loginManager logInWithPublishPermissions:@[@"email"]
                         fromViewController:self
                                    handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    //TODO: process error or result.
  }];
}

Quyền bị từ chối

Hãy kiểm tra FBSDKLoginResult được trả về cho lệnh gọi lại FBSDKLoginManager hoặc cho đối tượng ủy quyền FBSDKLoginButton để xem yêu cầu cấp quyền có bị từ chối hay không:

FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
[loginManager logInWithPublishPermissions:@[@"email"]
                       fromViewController:self
                                  handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
 if ([result.declinedPermissions containsObject:@”email”]) {
   // TODO: do not request permissions again immediately. Consider providing a NUX 
  // describing  why the app want this permission.
 } else {
 // ...
 }
}];

Thiếu quyền

Khi gửi các yêu cầu API Đồ thị, bạn có thể kiểm tra đối tượng NSError để xem có bị lỗi quyền hay không:

[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/feed"
                                   parameters:@{ @"message" : @"This is a status update" }
                                   HTTPMethod:@"POST"]
  startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
    if ([error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] isEqual:@200]) {
      NSLog(@"permission error");
    }
}];

Để biết thêm thông tin, hãy xem phần Xử lý lỗi, iOS SDK.

Yêu cầu cấp thêm quyền

Hãy sử dụng FBSDKLoginManager để yêu cầu cấp thêm quyền hoặc yêu cầu cấp các quyền từng bị từ chối bằng phương thức logInWith*: . FBSDKLoginManager sẽ xem đây là yêu cầu lại do có [FBSDKAccessToken currentAcccessToken].

Thu hồi quyền

Bạn có thể cho phép ai đó gỡ hoặc thu hồi các quyền cụ thể từng được cấp cho ứng dụng của bạn. Ví dụ: ứng dụng của bạn có thể có trang cài đặt để mọi người tắt các tính năng cụ thể.

Hãy thu hồi quyền bằng cách thực hiện lệnh gọi đến điểm cuối API Đồ thị.

[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions/email"
       parameters:nil
       HTTPMethod:@"DELETE"]
  startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
  // ...
}];

Thu hồi quyền đăng nhập

Bạn có thể thu hồi mọi đặc quyền cho một ứng dụng bằng cách thực hiện lệnh gọi API Đồ thị để xóa tất cả các quyền. Hãy sử dụng mã trong phần Thu hồi quyền và thay đổi đường dẫn của yêu cầu thành /me/permissions.


Thu hồi quyền thông qua Trình khám phá API Đồ thị

Vì mục đích thử nghiệm, bạn có thể muốn hủy cấp phép việc thu hồi quyền mà không dùng ứng dụng của mình. Bạn có thể sử dụng Trình khám phá API Đồ thị để hủy cấp phép.

  1. Truy cập vào Trình khám phá API Đồ thị.
  2. Chọn Ứng dụng của bạn.
  3. Nhấp vào Get Token > Get Access Token.
  4. Nhấp vào Clear để hủy cấp phép đối với ứng dụng đã chọn.

Cách thu hồi một quyền:

  1. Trong khi đang dùng quyền mà bạn muốn gỡ, hãy đặt trường nhập đường dẫn thành /me/permissions/{permission-name} cho {permission-name}, chẳng hạn như email.
  2. Chuyển từ GET thành DELETE.
  3. Nhấn vào nút Submit .
Trình khám phá API Đồ thị