web-dev-qa-db-fra.com

iOS Parse Facebook Erreur de connexion 308 FBSDKLoginBadChallengeString

J'essaie d'implémenter la connexion Facebook dans mon application iOS à l'aide de Parse. 

let permissionsArray = ["public_profile", "email"]

PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
    { (user: PFUser?, error: NSError?) in

    if let user = user {
        //we logged in!
    }
    else {
        //login error!
    }
}

Cela fonctionne bien dans le simulateur, mais pas sur le périphérique. Sur l'appareil, j'obtiens cette erreur:

Domaine d'erreur = com.facebook.sdk.login Code = 308 "L'opération n'a pas pu être terminée. (Com.facebook.sdk.login erreur 308.)

Le code d'erreur 308 est pour FBSDKLoginBadChallengeString , "Il manquait une chaîne de challenge valide dans la réponse de connexion."

Lorsque j'autorise mon application sur Facebook, cela s'appelle:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

L'URL est: 

fb1640722449492705://authorize/#state=%7B%22challenge%22%3A%225OKWv3wN%2BEH%2BeQu48Xv6ty%2BRuek%3D%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A1%2C%220_auth_logger_id%22%3A%22564CD915-2CFC-4989-9AF6-CEA389908D51%22%7D&granted_scopes=user_birthday%2Cpublic_profile&denied_scopes=&signed_request=c8SBBDeaNpF-R_XTYx4LRA0BWm5p9IwXDr8M4nL3YXI.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUURhTXJibGw4Q3dITkd5M0xnQmNkVTNuYWRkeEVoTU5mMmx3eFpZU2IwZl9SU284YXhZdXZaRS02RnA2bU5Cdy1CWkVoRmt2Zk1xX1AxSHltUG00aWhkWE9hYmlvWFBiMnpCYkVnR1RRX3lzZVFIZXdHU19OcmpkNUF6WGtob1dfVE4wTmRrSGk5MzY0V2hFWUJDV0dfcE16RXpQVExHWE13X1dzb0QzZGtITm5fM0tHNjFxUjJyM3RDWVlNQTE4WENpS1dXTHUyM2dIRVhmTXc3ZTQ0M2xDQUtGRl9KSXcyVk1sS01FOTQ4dHQ2U1Fqb0tlVkp4RmJNSEFsWDZFYWxlUnQ2aGRrTGZlU2xuVTV5VjZ1bFhldHkxeEV5RmRDZVFHb2RXQ0dULVVCd3QyM0haY0dxNk8zbnE1cDRNWjNFZ012U2JhSGZyMmF6Wm8xUXk2X2xSQVNWcFlMVDZUdU5wZnMwVkJqNEdSaFEiLCJpc3N1ZWRfYXQiOjE0MzM0MTg2MDksInVzZXJfaWQiOiIxNDM3MzM0ODk5OTIwNDA5In0&access_token=CAAXUOnbG6uEBANtAd9DzWBSu4LLOEcPsu86Ny0Ir

Oui, j'ai tout suivi dans Le guide de connexion de Parse sur Facebook (m'assure que tous les identifiants de paquet correspondent, implémente toutes les méthodes AppDelegate requises, etc.) 

Qu'est-ce que cette erreur signifie exactement et comment le résolvez-vous?

43
Eric

Fixe le. Ce problème était dû à la connexion avec Parse et avec FBSDKLoginButton.

Voici ce que je faisais:

//in my UI setup code:
let fbLoginButton = FBSDKLoginButton()
fbLoginButton.addTarget(self, action: "fbButtonTouched:", forControlEvents: UIControlEvents.TouchUpInside)

....

func fbButtonTouched() {
    let permissionsArray = ["public_profile", "email"]

    PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
        { (user: PFUser?, error: NSError?) in

            if let user = user {
                //we logged in!
            }
            else {
                //login error!
            }
    }
}

J'ai découvert (à la dure) que tapotant une FBSDKLoginButton tente de connecter l'utilisateur! Il n'était pas nécessaire de connecter également l'utilisateur en utilisant PFFacebookUtils.logInInBackgroundWithReadPermissions. Je viens donc de me débarrasser de fbButtonTouched() et je pouvais me connecter avec joie. 

Donc, ce qui s’est passé, c’est que j’essayais deux fois au même moment, ce qui a plu au simulateur, mais pas à l’appareil.

Si vous voulez savoir pourquoi, c'est parce que le défi d'authentification de connexion qu'il a reçu ne correspond pas à celui attendu parce qu'il a reçu celui de la première tentative de connexion après avoir envoyé celui du deuxième journal. tentative et attend donc la deuxième tentative de connexion des tentatives d’authentification. 

La documentation de FBSDKLoginButton ne mentionne pas pour le moment quoi que ce soit sur le fait que le fait de taper dessus lance le flux de journalisation, et parce que c'est une sous-classe de UIButton, vous penseriez que vous devriez addTarget et mettre en œuvre le flux de connexion vous-même. Et avoir deux connexions en même temps conduit à une variable FBSDKLoginBadChallengeString trompeuse. Recette pour un désastre...

EDIT: La documentation a été mise à jour en conséquence:

FBSDKLoginButton fonctionne avec [FBSDKAccessToken currentAccessToken] pour déterminer ce qu’il faut afficher, et démarre automatiquement l’authentification lorsque vous appuyez dessus (c’est-à-dire que vous n'avez pas besoin de souscrire manuellement des cibles d'action).

(mon emphase)

11
Eric

Une solution simple fonctionne pour moi. Activez simplement le partage de trousseau dans les capacités 

 Enable Keychain Sharing

49
Cuong Lam

J'ai suivi la solution de contournement de totvos et cela fonctionne aussi pour moi lorsque j'utilise FBSDKLoginKit 4.7.1 & FBSDKCoreKit 4.8:

Solution de contournement ... créez l'application et copiez-la sur le téléphone, puis démarrez l'application de l'appareil (pas le débogueur). Ensuite, attachez le débogueur au processus en cours. Cela semble résoudre tout problème de timing est cassé cela, et les différentes opérations de trousseau semblent fonctionner correctement lors du débogage.

Référence: https://forums.developer.Apple.com/thread/4743#85335


Mettre à jour:

Cette solution de contournement ne fonctionnant pas tout le temps, j'ai donc utilisé la réponse de @ coco ci-dessus: https://stackoverflow.com/a/31480026/877225

15
ObjSal

Je n'ai vu cette erreur que lorsque je me suis déconnecté, puis reconnecté. 

Mon code de connexion et mon code de déconnexion se trouvaient dans des fichiers différents, car l'interface utilisateur appropriée pour la connexion et la déconnexion étaient totalement différentes et j'avais instancié deux instances distinctes de FBSDKLoginManager. La consolidation en un seul cas a résolu le problème pour moi.

15
loudmouth

Apparemment, la seule solution qui a fonctionné pour moi consiste à ajouter le droit de partage du trousseau à la cible. 

Vous pouvez le trouver dans Project_name-> target_name-> Capabilities-> Keychain Sharing

15
Lolloz89

J'ai trouvé ce problème lorsque je suis passé à:

FBSDKCoreKit 4.4.0
FBSDKLoginKit 4.4.0
FBSDKShareKit 4.4.0.

Il est parti quand j'ai rétrogradé à:

FBSDKCoreKit 4.2.0
FBSDKLoginKit 4.1.0
FBSDKShareKit 4.1.0

Je n'ai pas encore eu l'occasion de découvrir à quel point les mises à niveau en sont la cause - par exemple, pourrais-je rester bloqué avec 4.3.0 pour les trois?

14
coco

Essayez d’exécuter votre application directement à partir de votre appareil sans avoir à la lancer depuis votre Xcode. Puis connectez-vous à Facebook sans être dérangé par 308. Après cela, vous pourrez reprendre le lancement à partir du Xcode sur votre appareil sans le même problème.

Cela semble être un problème entre le SDK FB et iOS et non lié à Parse. J'apprécierais que quelqu'un puisse nous éclairer sur ce sujet.

La version de mon Xcode est 7.1, FB SDK est 4.8.x.

8
MkVal

J'utilise

pod 'FBSDKCoreKit', '~> 4.8.0'
pod 'FBSDKLoginKit', '~> 4.8.0'
pod 'FBSDKShareKit', '~> 4.8.0'

... et avait le problème code 308 lorsque je me suis déconnecté et que je me suis connecté au cours de la même session. Utiliser [[FBSDKLoginManager alloc] logOut] ou [facebookLoginManager logOut] (avec un gestionnaire persistant) juste avant d'appeler logInWithReadPermissions: ne fonctionnait pas, mais l'ajout de

[FBSDKAccessToken setCurrentAccessToken:nil];
[FBSDKProfile setCurrentProfile:nil];

avant que l'appel logInWithReadPermissions: fonctionne correctement. (Testé sous iOS 9.2.)

7
Markus Rautopuro

Avant de rétrograder, j'essayais de vider le cache local. J'ai eu ce problème lors du basculement entre les comptes Facebook. Supprimez votre application, forcez Facebook à quitter, puis relancez le tout et voyez s'il persiste. Il se peut qu’un bogue se produise lorsque Facebook transmet une ancienne clé en cache qui n’est plus valide. Le déclassement peut être vider le cache ou l'ancienne version n'a pas le bogue. 

4
jriskin

si vous vous déconnectez et vous reconnectez sans quitter cette application, cette erreur aussi viens,

let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE")
            deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in
                println("the delete permission is \(result)")
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    FBSDKAccessToken.setCurrentAccessToken(nil)
                    FBSDKProfile.setCurrentProfile(nil)
                    fbLoginManager.logOut()
                    AppDelegate.sharedAppDelegte().logout()
                })
            })
4
Ravi H Malviya

J'ai également eu l'erreur 308, cependant je n'utilisais pas le SDK Parse. 

Ces erreurs ont commencé à apparaître lorsque j'ai mis à niveau le SDK Facebook iOS à partir de la version 4.0.1 (FacebookSDKs-iOS-20150402) vers l'une des versions les plus récentes (4.2.0 - FacebookSDKs-iOS-20150528 ou 4.3.0 - FacebookSDKs-iOS-20150625).

La mise à niveau du Facebook iOS SDK vers la version 4.0.1 a résolu ce problème pour moi.

Notons que les nouvelles versions du SDK semblent bien corrélées avec l’apparition de 308 messages d’erreur sur SO au début du mois de juin.

4
Dev-iL

Suivez ces étapes pour résoudre ce type d'erreur: 

  1. Allez à votre projet 
  2. Fonctions de clic 
  3. Activer l'accès au trousseau
3
Dishant Rajput

En utilisant PFFacebookUtils 1.9.0 et FBSDKLoginKit 4.7.0 M’est arrivé après la déconnexion et la connexion (sans redémarrer l’application) Solution - Objectif C: .__, ajoutez simplement [[PFFacebookUtils facebookLoginManager] logOut]; Avant [PFFacebookUtils logInInBackgroundWithReadPermissions

3
DaNLtR

Utilisez la même instance FBSDKLoginManager jusqu'à la déconnexion, ALORS créez une nouvelle instance.

[fbLoginManager logOut];
fbLoginManager = [[FBSDKLoginManager alloc] init];
2
irmu

Réponse officielle de Facebook:

Nous suivons déjà ce problème dans un autre rapport de bogue, et il semble que être une erreur du côté d'Apple.

https://developers.facebook.com/bugs/919990934704584/

2
Sergey Demchenko

Vous n'avez pas à déclasser pour cela. 

Effectuez les opérations suivantes et cela devrait fonctionner: - Nettoyez vos données dérivées (Xcode -> Préférences -> Emplacements -> Cliquez sur la petite flèche en regard de Données dérivées). Assurez-vous de lire à propos des données dérivées avant de procéder. Si vous avez un projet compliqué et que vous avez commis des erreurs stupides (ex: certains fichiers ont été supprimés), vous devrez peut-être résoudre le problème avant de relancer votre application. Mais ce ne sera pas si difficile .- Supprimer votre application de votre appareil/simulateur - Supprimer l'approbation de votre application Facebook de Facebook (Réglage -> Application -> Cliquez sur le "x" pour supprimer votre application)

Relancez l'application et tout devrait fonctionner.

Bonne chance!

1
Vicky Arora

Je résous le problème avec: 

0
Vlad Burlaciuc

Cela est dû au problème authenticationChallenge lorsque vous essayez par erreur de vous connecter deux fois simultanément, puis que des connexions supplémentaires vous donneront un avertissement de trousseau sur la console lors du débogage. Sans le mode de débogage, vous n'obtiendrez pas cette erreur, la raison en est que le trousseau fonctionnera correctement si vous n'êtes pas en train de déboguer. 

Il existe peu de solutions de contournement pour cela: 1. Essayez de vous connecter sans mode de débogage et une fois que vous avez réussi, vous pouvez également vous connecter avec succès en mode de débogage . 2. Recherchez le code d'erreur FBSDKLoginBadChallengeString et appelez [FBSDKAccessToken setCurrentAccessToken:nil] pour effacer le jeton et reconnectez-vous.

0
Milan Agarwal

Le code d'erreur 308 est FBSDKLoginBadChallengeString

L'utilisation d'une instance partagée pour FBSDKLoginManager résout le problème. J'ai créé un singleton qui garantit que seul un FBSDKLoginManager est instancié.

Je suppose que cela a à voir avec le login iOS9 Safari, mais pas à 100% si

0
MarkHim

J'ai eu le même problème quand j'essayais d'attraper un événement de connexion et de déconnexion comme ci-dessous

loginButton = [[FBSDKLoginButton alloc] init];
// Handle clicks on the button
[loginButton
 addTarget:self
 action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];

// Once the button is clicked, show the login dialog
-(void)loginButtonClicked
{
  FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
  [login
    logInWithReadPermissions: @[@"public_profile"]
          fromViewController:self
                     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) { 
      NSLog(@"Process error");
    } else if (result.isCancelled) {
      NSLog(@"Cancelled");
    } else {
      NSLog(@"Logged in");
    }
  }];
}

Mais ceci n’est utile que pour un bouton de connexion personnalisé; si vous utilisez le bouton de connexion par défaut du fb, le FBSDKLoginManager a déjà été initialisé, vous obtiendrez l’erreur en essayant de créer un autre. 

Donc, afin de saisir les événements de connexion et de déconnexion, il suffit de définir le bouton Déléguer pour la connexion, puis de le gérer comme suit: 

    loginButton = [[FBSDKLoginButton alloc] init];
    loginButton.delegate = self;


- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
    if (!error) {
        [self getFBProfile];
    }
}

- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton {
    [self logout];
}
0
thanhbinh84

Mettre à jour Facebook SDK à la dernière version a résolu ce problème.

0
liruqi