iOS Parse error de inicio de sesión de Facebook 308 FBSDKLoginBadChallengeString
parse.com (21)
si cierra sesión y vuelve a iniciar sesión sin salir de esta aplicación, este error también vendrá,
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()
})
})
Estoy tratando de implementar el inicio de sesión de Facebook en mi aplicación iOS, usando Parse.
let permissionsArray = ["public_profile", "email"]
PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
{ (user: PFUser?, error: NSError?) in
if let user = user {
//we logged in!
}
else {
//login error!
}
}
Esto funciona bien en el simulador, pero no en el dispositivo. En el dispositivo, aparece este error:
Error Domain = com.facebook.sdk.login Code = 308 "La operación no se pudo completar. (Com.facebook.sdk.login error 308.)
El código de error 308 es para FBSDKLoginBadChallengeString
, "A la respuesta de inicio de sesión le faltaba una cadena de desafío válida".
Después de autorizar mi aplicación en Facebook, se llama:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
La url es:
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.eyJhbGdvcml&access_token=CAAXUOnbG6uEBANtAd9DzWBSu4LLOEcPsu86Ny0Ir
Sí, seguí todo en la guía de inicio de sesión de Parse en Facebook (me aseguré de que todos los ID de los paquetes coincidieran, implementé todos los métodos de AppDelegate necesarios, etc.).
¿Qué significa exactamente este error y cómo lo resuelves?
Actualice Facebook SDK a la última versión resuelto esto.
Antes de degradar, intentaría borrar el caché local. Tuve este problema al cambiar entre cuentas de Facebook. Elimine su aplicación, fuerce a Facebook a cerrarla y luego vuelva a ejecutar todo y vea si persiste. Puede haber un error por el cual Facebook está pasando una vieja clave en caché que ya no es válida. La degradación podría estar limpiando el caché o la versión anterior no tiene el error.
Aparentemente, la única solución que funcionó para mí es agregar el derecho de compartir llavero para el objetivo.
Puede encontrarlo en Nombre_proyecto-> nombre_destino-> Capacidades-> Compartir Llaves
Arreglado. Este problema fue causado al iniciar sesión con Parse y con FBSDKLoginButton
.
Esto es lo que estaba haciendo:
//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!
}
}
}
¡Descubrí (por las malas) que al tocar un FBSDKLoginButton
intenta iniciar sesión en el usuario! No fue necesario registrar al usuario para usar PFFacebookUtils.logInInBackgroundWithReadPermissions
. Así que me deshice de fbButtonTouched()
y pude iniciar sesión con mucho fbButtonTouched()
.
Entonces, lo que sucedió fue que estaba intentando dos inicios de sesión al mismo tiempo, con lo que el simulador estaba contento, pero no con el dispositivo.
Si desea saber por qué, es porque el desafío de autenticación de inicio de sesión que recibió no se correspondía con el que esperaba porque recibió el del primer intento de inicio de sesión después de haber enviado el del segundo intento de inicio de sesión y, por lo tanto, esperando el segundo intento de autenticación de intentos de inicio de sesión.
La documentación para FBSDKLoginButton
actualmente no menciona nada sobre el hecho de que al tocarla inicia el flujo de inicio de sesión y, como es una subclase de UIButton
, podría pensar que debería addTarget
e implementar el flujo de inicio de sesión usted mismo. Y tener dos inicios de sesión al mismo tiempo conduce a una FBSDKLoginBadChallengeString
engañosa. Receta para el desastre ...
EDITAR: la documentación se ha actualizado correspondientemente:
FBSDKLoginButton
funciona con[FBSDKAccessToken currentAccessToken]
para determinar qué mostrar y automáticamente inicia la autenticación cuando se toca (es decir, no es necesario suscribir manualmente los objetivos de acción) .
(mi énfasis)
El código de error 308 es FBSDKLoginBadChallengeString
El uso de una instancia compartida para FBSDKLoginManager resuelve el problema. Creé un singleton que garantiza que solo se crea una instancia de FBSDKLoginManager.
Supongo que tiene que ver con el inicio de sesión de iOS9 Safari, aunque no está 100% seguro
Encontré este problema cuando actualicé a:
FBSDKCoreKit 4.4.0
FBSDKLoginKit 4.4.0
FBSDKShareKit 4.4.0.
Se fue cuando me degradaron a:
FBSDKCoreKit 4.2.0
FBSDKLoginKit 4.1.0
FBSDKShareKit 4.1.0
No he tenido la oportunidad de descubrir en qué punto las actualizaciones causan esto, por ejemplo, ¿podría haberme quedado con 4.3.0 para las tres?
Estoy usando
pod ''FBSDKCoreKit'', ''~> 4.8.0''
pod ''FBSDKLoginKit'', ''~> 4.8.0''
pod ''FBSDKShareKit'', ''~> 4.8.0''
... y tenía el problema del code 308
cuando me desconecté e inicié sesión durante la misma sesión. Utilizando [[FBSDKLoginManager alloc] logOut]
o [facebookLoginManager logOut]
(con un administrador persistente) justo antes de llamar a logInWithReadPermissions:
no funcionó, pero agregó
[FBSDKAccessToken setCurrentAccessToken:nil];
[FBSDKProfile setCurrentProfile:nil];
antes de logInWithReadPermissions:
llamada funciona bien. (Probado en iOS 9.2)
Estoy usando PFFacebookUtils 1.9.0 y FBSDKLoginKit 4.7.0 después de la solución de cierre de sesión e inicio de sesión (sin reiniciar la aplicación) - objetivo c: simplemente agregue [[PFFacebookUtils facebookLoginManager] logOut];
antes de [PFFacebookUtils logInInBackgroundWithReadPermissions
He seguido la solución de totvos y también funciona para mí cuando uso FBSDKLoginKit 4.7.1 y FBSDKCoreKit 4.8:
Solución alternativa: obtener la aplicación creada y copiada en el teléfono, y luego iniciar la aplicación desde el dispositivo (no el depurador). Luego, conecte el depurador al proceso en ejecución. Esto parece evitar cualquier problema de temporización al romper esto, y las diversas operaciones de llavero parecen funcionar correctamente durante la depuración.
Referencia: https://forums.developer.apple.com/thread/4743#85335
Actualizar:
Esta solución no funcionó todo el tiempo, así que terminé usando la respuesta de @ coco anterior: https://.com/a/31480026/877225
Intente ejecutar su aplicación directamente desde su dispositivo sin tener que iniciarlo desde su Xcode. Luego, inicie sesión en Facebook sin preocuparse por 308. Después de eso, puede reanudar el lanzamiento desde el Xcode a su dispositivo sin el mismo problema.
Esto parece un problema entre FB SDK e iOS y no está relacionado con Parse. Agradecería que alguien pudiera informarnos sobre este tema.
La versión de My Xcode es 7.1, FB SDK es 4.8.x.
Lo soluciono con: 1.Agregar Bolts.framework 2.in AppDelegate: #import
No tiene que degradar para esto.
Realice las siguientes acciones y debería funcionar: - Limpie sus datos derivados (Xcode -> Preferencias -> Ubicaciones -> Haga clic en la flecha pequeña al lado de Datos derivados). Asegúrese de leer sobre los datos derivados antes de realizar esto. Si tienes un proyecto complicado y has cometido algunos errores tontos (por ejemplo, eliminar algún archivo), tendrás que resolver el problema antes de volver a ejecutar tu aplicación. Pero no será tan difícil. - Elimine su aplicación de su dispositivo / simulador - Elimine la aprobación de su aplicación de Facebook de Facebook (Configuración -> Aplicación -> Haga clic en la "x" para eliminar su aplicación)
Vuelva a ejecutar la aplicación y todo debería funcionar.
¡Buena suerte!
Obtuve el mismo problema cuando estaba tratando de atrapar el inicio de sesión y el cierre de sesión como a continuación
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");
}
}];
}
Pero esto solo es bueno para un botón de inicio de sesión personalizado, si está utilizando el botón de inicio de sesión de fb predeterminado, el FBSDKLoginManager ya se ha inicializado, obtendrá el error cuando intente crear otro.
Por lo tanto, para detectar el evento de inicio de sesión y cierre de sesión, simplemente configure el delegado para el botón de inicio de sesión y luego maneje de la siguiente manera:
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];
}
Respuesta oficial de Facebook:
Ya estamos haciendo un seguimiento de este problema en otro informe de error, y parece ser un error del lado de Apple.
Se debe al problema de autenticación de desafío cuando, por error, intenta iniciar sesión dos veces al mismo tiempo y, luego, más inicios de sesión le dan alguna advertencia de llavero en la consola durante la depuración, este error se notará cuando vaya a depurar en el dispositivo. Sin el modo de depuración no obtendrás este error, la razón es que el llavero funcionará bien cuando no estás depurando.
Hay algunas soluciones para esto: 1. Intente iniciar sesión sin modo de depuración y, una vez que haya tenido éxito, podrá iniciar sesión con éxito también con el modo de depuración. 2. Busque el código de error FBSDKLoginBadChallengeString y llame [FBSDKAccessToken setCurrentAccessToken:nil]
para borrar el token y vuelva a iniciar sesión.
Siga estos pasos para resolver ese tipo de error:
- Ve a tu proyecto
- Haz clic en Capacidades
- Habilitar el acceso al llavero
Solo vi este error cuando cerré la sesión y luego inicié sesión nuevamente.
Mi código de inicio de sesión y de cierre de sesión se ubicaron en diferentes archivos, ya que la interfaz de usuario relevante para el inicio de sesión y el cierre de sesión son completamente diferentes, y yo había instanciado dos instancias de FBSDKLoginManager por separado. Consolidarme a una sola instancia resolvió el problema para mí.
También tuve el error 308, sin embargo, no estaba usando el SDK de Parse.
Estos errores comenzaron a aparecer cuando actualicé el SDK de iOS de Facebook de la versión 4.0.1
( FacebookSDKs-iOS-20150402
) a una de las versiones más recientes ( 4.2.0
- FacebookSDKs-iOS-20150528
o 4.3.0
- FacebookSDKs-iOS-20150625
) .
La degradación del SDK de iOS de Facebook a la versión 4.0.1
resolvió este problema para mí.
Como nota al margen: las nuevas versiones del SDK parecen correlacionarse bien con la aparición de 308 mensajes de error en SO a principios de junio.
Use la misma instancia de FBSDKLoginManager hasta el cierre de sesión, luego cree una nueva instancia.
[fbLoginManager logOut];
fbLoginManager = [[FBSDKLoginManager alloc] init];