Limited Login pour iOS

Limited Login permet aux développeur·ses de signaler qu’une connexion est limitée en termes de suivi des utilisateur·ices.

Objectifs

Lorsqu’une tentative de connexion réussit, une instance AuthenticationToken globale est générée. Celle-ci fournit des informations sur la connexion qui permettent de vérifier l’authentification sur les serveurs de votre clientèle. Une instance « Profile » partagée contenant des informations générales (dont l’ID spécifique à une application associé à l’utilisateur·ice, le nom de l’utilisateur·ice et la photo de profil) est également générée.

Autorisations

Les autorisations disponibles que vous pouvez demander sont les suivantes :

  • 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 personnalisés

Limited Login permet aux développeur·ses de transmettre un nonce qui sera utilisé lors de la vérification d’une tentative d’authentification sur leurs serveurs. Pour plus d’informations sur l’utilisation du nonce pour valider les tokens, voir la page Validation du token Limited Login OIDC.

Restrictions

Le changement d’application, dans lequel la boîte de dialogue de connexion est présentée à l’utilisateur·ice dans l’application Facebook pour iOS lorsqu’il ou elle y est déjà connecté·e, n’est pas pris en charge pour les flux de connexion limités.

Nouveaux éléments d’API

Le SDK Facebook pour iOS fournit une nouvelle énumération FBSDKLoginTracking. Les valeurs possibles sont enabled et limited. Pour Limited Login, utilisez la valeur limited.

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

Limited Login utilise également FBSDKLoginConfiguration pour modifier le comportement par défaut d’une tentative de connexion. Cette configuration doit être créée avec les propriétés par défaut, des propriétés explicites (Swift uniquement) ou l’un des nombreux initialiseurs suivants :

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

Propriétés

PropriétéDescription

requestedPermissions: Set<Permissions> (Swift)

Autorisations demandées pour la tentative de connexion. La valeur par défaut est un ensemble vide.

requestedPermissions : Set<String> (ObjC)

Autorisations demandées pour la tentative de connexion. La valeur par défaut est un ensemble vide.

tracking : LoginTracking

Préférence de suivi de la connexion. Valeur par défaut : .enabled.

nonce : String

Nonce avec lequel la configuration a été créée. Un nonce unique sera utilisé si aucun nonce n’a été fourni à la méthode de fabrique.

Les conditions suivantes doivent être remplies pour qu’une configuration soit créée :

  • Le nonce doit être une chaîne non vide sans espace.

  • Vous ne pouvez pas demander des autorisations qui sortent du champ d’application du suivi. Par exemple, demander user_likes ne fonctionne pas si le suivi est défini sur .limited.

  • Pour connaître les autorisations que vous pouvez demander, voir la section Autorisations.

Implémenter Limited Login

Pour implémenter Limited Login dans votre application directement avec la classe « login manager », passez à la version la plus récente du SDK Facebook pour iOS, et utilisez le code suivant :

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

Pour implémenter Limited Login dans votre application avec le bouton de connexion, passez à la version la plus récente du SDK Facebook pour iOS, et utilisez le code suivant :

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
}