GetLoginStatus returns unknown status when trying to exit Facebook using the Facebook JS SDK

I have a localhost site where I implemented Facebook login using the Facebook C # SDK.

Startup Configuration Class :

public class ExternalLoginConfig { public void ConfigureAuth(IAppBuilder app) { app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); var facebookAuthenticationOptions = new FacebookAuthenticationOptions() { AppId = ConfigSettings.FacebookAppId, AppSecret = ConfigSettings.FacebookAppSecret, Scope = { "email" }, Provider = new FacebookAuthenticationProvider() { OnAuthenticated = context => { var accessToken = context.AccessToken; var facebookClient = new FacebookClient(accessToken); var result = facebookClient.Get("me", new { fields = "email,first_name,last_name" }) as JsonObject; string email = null; string firstName = null; string lastName = null; if (result != null) { email = result.ContainsKey("email") ? (string) result["email"] : null; firstName = result.ContainsKey("first_name") ? (string) result["first_name"] : null; lastName = result.ContainsKey("last_name") ? (string) result["last_name"] : null; } if (firstName != null) { context.Identity.AddClaim(new Claim(ClaimTypes.GivenName, firstName)); } if (lastName != null) { context.Identity.AddClaim(new Claim(ClaimTypes.Surname, lastName)); } if (email != null) { context.Identity.AddClaim(new Claim(ClaimTypes.Email, email)); } return Task.FromResult(0); }, OnApplyRedirect = context => { context.Response.Redirect(context.RedirectUri + "&auth_type=reauthenticate"); } } }; app.UseFacebookAuthentication(facebookAuthenticationOptions); } } 

Authentication controller action form :

 [HttpPost] [AllowAnonymous] public virtual ActionResult Login(string provider, string returnUrl) { ControllerContext.HttpContext.Session.RemoveAll(); return new ExternalLoginResult(provider, Url.Action("LoginCallback", "Oauth", new { ReturnUrl = returnUrl })); } [AllowAnonymous] public async Task<ActionResult> LoginCallback(string returnUrl, string error) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return Redirect(returnUrl); } User user = null; string userName = Guid.NewGuid().ToString(); string firstName = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.GivenName); string lastName = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Surname); string email = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Email); string externalProviderName = loginInfo.Login.LoginProvider; string externalProviderKey = loginInfo.Login.ProviderKey; var externalAuthenticationInfo = new ExternalAuthenticationInfo() { Username = userName, Email = email, FirstName = firstName, LastName = lastName, ExternalProviderName = externalProviderName, ExternalProviderKey = externalProviderKey }; var loginResult = userProvider.ExternalLogin(externalProviderKey, email, out user); switch (loginResult) { case LoginResult.Success: { AuthenticationHelper.SetAuthenticatedUserId(user.ID); break; } case LoginResult.NotRegistered: { var registerResult = userProvider.Register(userName, email, null, externalAuthenticationInfo); if (registerResult.IsValid) { AuthenticationHelper.SetAuthenticatedUserId(registerResult.Result.ID); } break; } } return Redirect(returnUrl); } 

Initializing the Facebook JS SDK :

 window.fbAsyncInit = function () { FB.init({ appId: '@ConfigSettings.FacebookAppId', xfbml: true, version: 'v2.4' }); }; (function (d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) { return; } js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/en_US/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); 

I am trying to pull a user out of Facebook using the Facebook JS SDK, but calling:

 FB.getLoginStatus(function facebookLogoutCallback(facebookResponse) { if (facebookResponse.status !== 'connected') { return; } FB.logout(facebookLogoutCallback); }); 

results in unknown status instead of connected , which is returned in the facebookResponse object. I also tried calling FB.logout() without an if , but that didn't work.

Perhaps you can say that this behavior is caused by the unauthorized status of the user, but after logging in to the server account, the user actually registered on my site and on Facebook, too.

+6
source share
1 answer

There seems to be an error in FB.logout. After calling it, the user cannot enter this application again using the JS SDK, because the FB.login function returns an object {status = "unknown", authResponse = null}

EDIT:
Found that there is a cookie called "fblo_ *" created after FB.logout (), which seems to be the reason for this. I can’t say exactly why he is there and what he is doing, but deleting it does the entry work again.

To do this, I created a small script that looks for this cookie and deletes it just before I call FB.login (), which you probably want to call in the click event ( https://developers.facebook.com/docs /reference/javascript/FB.login/v2.5 ).

 function delete_cookie(name) { document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/'; } var cookies = document.cookie.split(";"); for (var i = 0; i < cookies.length; i++) { if(cookies[i].split("=")[0].indexOf("fblo_") != -1) delete_cookie(cookies[i].split("=")[0]); } 
+8
source

All Articles