web-dev-qa-db-fr.com

Facebook OAuth a cessé de fonctionner soudainement

J'ai remarqué hier que mon identifiant Facebook pour mon site Web ne fonctionnait plus.

Cela a bien fonctionné ces 2 derniers mois, pour autant que je sache, je n’ai rien changé. J'ai tout essayé sur des liens tels que: - ainsi que de nombreux autres ...

L'authentification Facebook ASP.NET MVC5 OWIN Facebook ne fonctionne tout à coup pas

J'ai remarqué que l'authentification Facebook de Stack Overflow a également cessé de fonctionner.

Quelqu'un d'autre a-t-il remarqué cela et trouvé une solution? Il est à noter que j'utilise les services d'application Azure pour héberger. Mais ce problème se trouve également lorsque j'utilise localhost.

Ma configuration actuelle ressemble à ceci ...

dans Startup.Auth.cs

var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
    AppId = "xxxxxxxxxxxxx",
    AppSecret = "xxxxxxxxxxxx"
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);

Dans la méthode suivante, loginInfo est null à chaque fois.

[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
    if (loginInfo == null)
    {
        return RedirectToAction("Login");
    }

J'ai également ajouté une session "WAKEUP" à partir d'une suggestion de publication différente, fb auth a échoué une fois auparavant et cela a résolu le problème cette fois-ci, mais il est revenu.

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
    Session["WAKEUP"] = "NOW!";

    // Request a redirect to the external login provider
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}
12
user3284707

Comme l'explique RockSheep. Facebook a abandonné le support vor API v2.2. Vous devez mettre à jour vos packages de nuget OWIN.

Vous pouvez trouver le numéro sur github (du projet Katana).

Assurez-vous d'activer pre releases dans votre gestionnaire de pépites, afin de pouvoir mettre à jour les packages de pépites vers la version v3.1.0-rc1. Mais attention: après la mise à jour, vous devez tester votre connexion avec précaution (vous avez peut-être aussi d'autres fournisseurs d'authentification, tels que Microsoft ou Google, vous devriez également les tester).

Technique

L'API a changé le numéro de version en v2.8 et la valeur de retour de l'API est maintenant au format JSON et n'est plus échappée dans l'URI. Les 'anciens' packages OWIN ne peuvent pas gérer ces modifications.

[Jeton d'accès Oauth] - Le format de réponse de https://www.facebook.com/v2.3/oauth/access_token est renvoyé lorsque vous échangez un code pour un. access_token retourne maintenant un JSON valide au lieu que soit encodé en URL. Le nouveau format de cette réponse est {"access_token": {TOKEN}, "type de jeton": {TYPE}, "expires_in": {TIME}}. Nous avons fait cette mise à jour Pour se conformer à la section 5.1 de la RFC 6749.

Ici vous pouvez trouver les changements de code sur GitHub pour plus d’informations et une meilleure compréhension.

13
Joehl

Beaucoup de gens ont commencé à avoir des problèmes après hier. Cela est dû au fait que Facebook a cessé de prendre en charge la version 2.2 de son API. Pour une raison quelconque, leur système redirige toujours les appels autorisés n’utilisant pas de numéro de version vers l’API 2.2. Un correctif rapide consiste à s'assurer que la version de l'API est envoyée avec l'appel de l'API.

À partir de la v2.3, Facebook a également commencé à renvoyer des objets JSON. Donc, assurez-vous de changer cela dans le code également.

5
RockSheep

J'ai eu le même problème, trouvé la solution ici Fix facebook oauth 2017

Fondamentalement, vous devez étendre HttpClientHandler et décoder la réponse JSON au lieu du corps

2
Denis PAshkov

Voici une solution pour ceux qui utilisent scribe Java. 

 public Token extract(String response)
  {
    Preconditions.checkEmptyString(response, "Response body is incorrect. Can't extract a token from an empty string");
    JSONObject obj = new JSONObject(response);
    return new Token(obj.get("access_token").toString(), EMPTY_SECRET, response);
  }
1
Thomas Adrian

Créez une nouvelle classe et définissez l'extracteur sur JSON. 

import org.scribe.builder.api.DefaultApi20;
import org.scribe.extractors.AccessTokenExtractor;
import org.scribe.extractors.JsonTokenExtractor;
import org.scribe.model.OAuthConfig;

public class FaceFmApi extends DefaultApi20 {

    @Override
    public String getAccessTokenEndpoint()
    {
        return "https://graph.facebook.com/oauth/access_token";
    }

    @Override
    public AccessTokenExtractor getAccessTokenExtractor()
    {
        return new JsonTokenExtractor();
    }

    @Override
    public String getAuthorizationUrl(OAuthConfig config) {
        return null;
    }
}

et injectez votre classe nouvellement créée comme ci-dessous. Alors getAccessToken() fonctionnera comme prévu.

public OAuthService getService() {
    return new ServiceBuilder().provider(FaceFmApi.class)
        .apiKey(config.getApiKey()).apiSecret(config.getApiSecret())
        .callback(config.getCallback()).build();
}
0
Huseyin Demirkale