Limited Login per iOS

Limited Login consente agli sviluppatori di segnalare che un accesso è limitato in termini di monitoraggio degli utenti.

Cosa aspettarsi

Un tentativo di accesso riuscito popolerà un'istanza globale AuthenticationToken che fornisce informazioni sul tentativo di accesso che possono essere utilizzate per verificare l'autenticazione sui server del client. Inoltre, popoleremo un'istanza di profilo condivisa che conterrà informazioni di base tra cui un ID per singola app per l'utente, il nome dell'utente e la foto del profilo.

Autorizzazioni

Le autorizzazioni disponibili che puoi richiedere sono le seguenti:

  • 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

Nonce personalizzati

Limited Login consente agli sviluppatori di passare un nonce da utilizzare per verificare un tentativo di autenticazione sui propri server. Per informazioni sull'uso dei nonce per convalidare i token, consulta Convalida del token OIDC Limited Login.

Limitazioni

Il cambiamento di app, presentando la finestra di dialogo Accedi agli utenti nell'app Facebook per iOS quando hanno già effettuato l'accesso, non è supportato per i flussi Limited Login.

Nuovi elementi API

L'SDK di Facebook per iOS fornisce una nuova enumerazione FBSDKLoginTracking. I valori possibili sono enabled e limited. Per Limited Login, usare limited.

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

Inoltre, Limited Login utilizza FBSDKLoginConfiguration per modificare il comportamento predefinito di un tentativo di accesso. Questa configurazione può essere creata con proprietà predefinite, proprietà esplicite (solo Swift) o con uno dei diversi inizializzatori:

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

Proprietà

ProprietàDescrizione

requestedPermissions: Set<Permissions> (Swift)

Autorizzazioni richieste per il tentativo di accesso. Per impostazione predefinita, è un set vuoto.

requestedPermissions: Set<String> (ObjC)

Autorizzazioni richieste per il tentativo di accesso. Per impostazione predefinita, è un set vuoto.

tracking: LoginTracking

Preferenza di monitoraggio degli accessi. Valore predefinito: false.

nonce: String

Nonce con cui è stata creata la configurazione. Verrà utilizzato un nonce univoco se non ne viene fornito nessuno nel metodo factory.

Il tentativo di creare una configurazione non va a buon fine se non sono soddisfatte le seguenti condizioni:

  • Nonce deve essere una stringa non vuota che non include spazi bianchi.

  • Non è possibile richiedere autorizzazioni che esulano dall'ambito del monitoraggio. Ad esempio, la richiesta di user_likes non funziona se il monitoraggio è .limited.

  • Consulta la sezione Autorizzazioni per vedere quali autorizzazioni puoi richiedere.

Implementazione di Limited Login

Per implementare Limited Login nella tua app utilizzando direttamente la classe di gestione degli accessi, esegui l'aggiornamento all'ultima versione di SDK di Facebook per iOS e utilizza il codice seguente:

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

Per implementare Limited Login nella tua app utilizzando il pulsante di accesso, esegui l'aggiornamento all'ultimo SDK di Facebook per iOS e utilizza il codice seguente:

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
}