iOS용 제한적 로그인

제한적 로그인을 통해 개발자는 사용자 추적 시 로그인이 제한된다는 점을 알릴 수 있습니다.

참고 사항

로그인 시도가 성공하면 클라이언트 서버에서 인증을 확인하는 데 사용할 수 있는 로그인 시도에 관한 정보를 제공하는 글로벌 AuthenticationToken 인스턴스가 작성됩니다. 또한 앱 범위 사용자 ID, 사용자 이름, 프로필 사진 등의 기본 정보를 포함한 공유된 프로필 인스턴스가 작성됩니다.

권한

요청할 수 있는 사용 가능한 권한은 다음과 같습니다.

  • public_profile
  • email
  • gaming_profile
  • gaming_user_picture
  • user_age_range
  • user_birthday
  • user_friends
  • user_gender
  • user_hometown
  • user_link
  • user_location
  • user_messenger_contact

사용자 지정 임시 값

제한적 로그인을 통해 개발자는 서버에서 인증 시도를 확인하는 데 사용할 임시 값을 전달할 수 있습니다. 임시 값을 사용한 토큰 검증에 대한 자세한 내용은 제한적 로그인 OIDC 토큰 검증을 참조하세요.

제한 사항

사용자가 이미 iOS용 Facebook 앱에 로그인한 경우 해당 사용자에게 로그인 대화 상자를 표시하는 앱 스위치는 제한적 로그인 플로에서 지원되지 않습니다.

새 API 요소

iOS용 Facebook SDK는 새 FBSDKLoginTracking 열거를 제공합니다. 사용 가능한 값은 enabledlimited입니다. 제한적 로그인에는 limited를 사용합니다.

enum LoginTracking {
    case enabled
    case limited
}
typedef NS_ENUM(NSUInteger, FBSDKLoginTracking)
{
  FBSDKLoginTrackingEnabled,
  FBSDKLoginTrackingLimited,
} NS_SWIFT_NAME(LoginTracking);

또한 제한적 로그인은 FBSDKLoginConfiguration을 사용하여 로그인 시도의 기본 동작을 수정합니다. 이 구성은 기본 속성, 명시적 속성(Swift 전용) 또는 여러 가지 이니셜라이저 중 하나를 사용하여 생성할 수 있습니다.

init?(
    permissions: Set
initWithPermissions:(NSArray\<NSString *> *)permissions                                                          
           tracking:(FBSDKLoginTracking)tracking
              nonce:(NSString *)nonce

속성

속성설명

requestedPermissions: Set<Permissions>(Swift)

로그인 시도에 요청된 권한입니다. 기본값은 빈 세트입니다.

requestedPermissions: Set<String>(ObjC)

로그인 시도에 요청된 권한입니다. 기본값은 빈 세트입니다.

tracking: LoginTracking

로그인 추적 기본 설정입니다. 기본값은 .enabled입니다.

nonce: String

구성 생성 시 제공하는 임시 값입니다. 팩터리 메서드에 아무 값도 제공되지 않으면 고유 임시 값을 사용합니다.

다음과 같은 조건을 충족하지 못하면 구성 생성 시도가 실패합니다.

  • 임시 값은 공백이 없고 비어 있지 않은 문자열이어야 합니다.

  • 추적 범위를 벗어나는 권한을 요청할 수 없습니다. 예를 들어 추적이 .limited 상태이면 user_likes를 요청할 수 없습니다.

  • 요청할 수 있는 권한은 권한 섹션을 참조하세요.

제한적 로그인 구현

로그인 관리자 클래스를 직접 사용하여 앱에 제한적 로그인을 구현하려면 최신 iOS용 Facebook SDK로 업그레이드하고 다음 코드를 사용하세요.

let loginManager = LoginManager()

// Ensure the configuration object is valid
guard let configuration = LoginConfiguration(
	permissions:["email", "user_friends", "user_birthday", "user_age_range", "user_gender", "user_location", "user_hometown", "user_link"],  
	tracking: .limited,
	nonce: "123"
) 
else {
    return
}

loginManager.logIn(configuration: configuration) { result in
    switch result {
    case .cancelled, .failed:
        // Handle error
        break
    case .success:
        // getting user ID
        let userID = Profile.current?.userID

        // getting pre-populated email
        let email = Profile.current?.email

        // getting pre-populated friends list
        let friendIDs = Profile.current?.friendIDs

        // getting pre-populated user birthday
        let birthday = Profile.current?.birthday

        // getting pre-populated age range
        let ageRange = Profile.current?.ageRange

        // getting user gender
        let gender = Profile.current?.gender
  
        // getting user location
        let location = Profile.current?.location
  
        // getting user hometown
        let hometown = Profile.current?.hometown
  
        // getting user profile URL
        let profileURL = Profile.current?.linkURL
  
        // getting id token string
        let tokenString = AuthenticationToken.current?.tokenString
    }
}
FBSDKLoginManager *loginManager = [FBSDKLoginManager new];
FBSDKLoginConfiguration *configuration =
  [[FBSDKLoginConfiguration alloc] initWithPermissions:@[@"email", @"user_friends", @"user_birthday", @"user_age_range", @"user_hometown", @"user_location", @"user_gender", @"user_link"]
                                              tracking:FBSDKLoginTrackingLimited
                                                 nonce:@"123"];
[loginManager logInFromViewController:self
                        configuration:configuration
                           completion:^(FBSDKLoginManagerLoginResult * result, NSError *error) {
  if (!error && !result.isCancelled) {
    // Login successful

    // getting user ID
    NSString *userID =
      FBSDKProfile.currentProfile.userID;

    // getting id token string
    NSString *idTokenString =
      FBSDKAuthenticationToken.currentAuthenticationToken.tokenString;

    // fetching pre-populated email
    NSString *email = FBSDKProfile.currentProfile.email;
  
    // getting pre-populated friends list
    NSArray<FBSDKUserIdentifier *> *friendIDs = FBSDKProfile.currentProfile.friendIDs;

    // getting pre-populated user birthday
    NSDate *birthday = FBSDKProfile.currentProfile.birthday;

    // getting pre-populated age range
    FBSDKUserAgeRange *ageRange = FBSDKProfile.currentProfile.ageRange;  
  
    // getting pre-populated age range
    FBSDKLocation *hometown = FBSDKProfile.currentProfile.hometown;  
  
    // getting pre-populated age range
    FBSDKLocation *location = FBSDKProfile.currentProfile.location;  
  
    // getting pre-populated age range
    NSString *gender = FBSDKProfile.currentProfile.gender;  
  
    // getting pre-populated age range
    NSURL *userLink = FBSDKProfile.currentProfile.linkURL;  
  }
}];

로그인 버튼을 사용하여 앱에 제한적 로그인을 구현하려면 최신 iOS용 Facebook SDK로 업그레이드하고 다음 코드를 사용하세요.

override func viewDidLoad() {
    super.viewDidLoad()

    setupLoginButton()
}
  
func setupLoginButton() {
    loginButton.delegate = self
    
    loginButton.permissions = ["email"]
    loginButton.loginTracking = .limited
    loginButton.nonce = "123" as NSString
}

func loginButton(
    _ loginButton: FBLoginButton,
    didCompleteWith potentialResult: LoginManagerLoginResult?,
    error potentialError: Error?
) {
    if let error = potentialError {
        // Handle Error
    }

    guard let result = potentialResult else {
        // Handle missing result  
    }
        
    guard !result.isCancelled else {
        // Handle cancellation
    }

    // Handle successful login
  
    let userID = Profile.current?.userID
    let email = Profile.current?.email
    let tokenString = AuthenticationToken.current?.tokenString
}
- (void)viewDidLoad
{
  [super viewDidLoad];

  [self setupLoginButton];
}
  
- (void)setupLoginButton
{
  self.loginButton.delegate = self;  
  self.loginButton.permissions = @[@"email"]
  self.loginButton.loginTracking = FBSDKLoginTrackingLimited
  self.loginButton.nonce = @"123"
}

- (void)    loginButton:(FBSDKLoginButton *)loginButton
  didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result
                  error:(NSError *)error
{
  if (error) {
    // Handle error
  }

  if (result && result.isCancelled) {
    // Handle cancellation
  }

  // Handle success
}