Inicio de sesión limitado para iOS

El inicio de sesión limitado permite a los desarrolladores señalar que un inicio de sesión es limitado en términos de seguimiento de los usuarios.

Qué cabe esperar

Un intento correcto de inicio de sesión rellenará una instancia AuthenticationToken global que proporciona información sobre el intento de inicio de sesión que se puede usar para verificar la autenticación en los servidores del cliente. Además, rellenaremos una instancia del perfil compartido que incluirá información básica, tal como un identificador específico de la aplicación del usuario, el nombre del usuario y la foto de perfil.

Permisos

Los permisos disponibles que puedes solicitar son los siguientes:

  • 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

Nonces personalizados

El inicio de sesión limitado permite a los desarrolladores pasar un nonce para usarlo a la hora de verificar un intento de autenticación en sus servidores. Para obtener información sobre cómo usar el nonce para validar los identificadores, consulta Validación del identificador de OIDC del inicio de sesión limitado.

Limitaciones

El cambio de aplicación, en el que el cuadro de diálogo de inicio de sesión se muestra al usuario en la aplicación de Facebook para iOS cuando ya ha iniciado sesión, no es compatible con los procesos del inicio de sesión limitado.

Nuevos elementos de la API

El SDK de Facebook para iOS proporciona una nueva enumeración FBSDKLoginTracking. Los posibles valores son enabled y limited. En el caso del inicio de sesión limitado, usa limited.

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

Además, el inicio de sesión limitado usa FBSDKLoginConfiguration para modificar el comportamiento predeterminado de un intento de inicio de sesión. Esta configuración se creará con las propiedades predeterminadas, las propiedades explícitas (solo Swift) o uno de los diversos inicializadores:

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

Propiedades

PropiedadDescripción

requestedPermissions: Set<Permissions> (Swift)

Permisos solicitados para el intento de inicio de sesión. El valor predeterminado es un conjunto vacío.

requestedPermissions: Set<String> (ObjC)

Permisos solicitados para el intento de inicio de sesión. El valor predeterminado es un conjunto vacío.

tracking: LoginTracking

Preferencia de seguimiento del inicio de sesión. El valor predeterminado es .enabled.

nonce: String

Nonce con el que se ha creado la configuración. Se usará un nonce único si no se proporciona ninguno para el método de fábrica.

Se produce un error al intentar crear una configuración si no se cumplen las siguientes condiciones:

  • El nonce debe ser una cadena no vacía que no incluya espacios en blanco.

  • No puedes solicitar permisos que estén fuera del alcance del seguimiento. Por ejemplo, la solicitud de user_likes no funcionará si el seguimiento es .limited.

  • Consulta los permisos que puedes solicitar en la sección Permisos.

Implementar el inicio de sesión limitado

Para implementar el inicio de sesión limitado en una aplicación directamente con la clase del administrador de inicios de sesión, mejora el SDK de Facebook para iOS al más reciente y usa el siguiente código:

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;  
  }
}];

Para implementar el inicio de sesión limitado en una aplicación con el botón “Iniciar sesión”, mejora el SDK de Facebook para iOS al más reciente y usa el siguiente código:

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
}