Facebook OAuth прекратил работать внезапно

Вчера я заметил, что мой аккаунт в Facebook для моего сайта перестает работать.

Это работает отлично в течение последних двух месяцев, насколько мне известно, я ничего не изменил. Я пробовал все, что мог, по ссылкам, таким как: - и многие другие...

ASP.NET MVC5 OWIN Facebook аутентификация внезапно не работает

Я заметил, что также перестала работать сценарий Qaru Facebook.

Кто-нибудь еще заметил это и нашел какое-либо решение? Стоит отметить, что я использую сервисы azure app для размещения. Но эта проблема также обнаруживается, когда я использую localhost.

Моя текущая настройка выглядит так...

в Startup.Auth.cs

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

В следующем методе loginInfo есть null каждый раз.

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

Я также добавил сеанс "WAKEUP" из другого предложения post, fb auth провалился один раз раньше, и на этот раз это устранило проблему, но оно вернулось.

[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 }));
}

Ответ 1

Как объяснил RockSheep. Facebook отказался от поддержки vor API v2.2. Вам необходимо обновить пакеты OWIN nuget.

Вы можете найти вопрос о github (из Katanaproject).

Обязательно активируйте предварительные выпуски в вашем менеджере nuget, чем вы можете обновить пакеты nuget до версии v3.1.0-rc1. Но будьте осторожны: после обновления вам необходимо тщательно протестировать свой логин (возможно, у вас также есть другие поставщики проверки подлинности, такие как Microsoft или Google, вы также должны их протестировать).

Технический

Api изменил номер версии на v2.8, и возвращаемое значение API теперь находится в JSON-Format и больше не экранировано в URI. "Старые" пакеты OWIN не могут справиться с этими изменениями.

[Oauth Access Token] Формат - формат ответа https://www.facebook.com/v2.3/oauth/access_token вернулся, когда вы обмен кода для access_token теперь возвращает действительный JSON вместо кодирование URL. Новый формат этого ответа: { "access_token": {TOKEN}, "token_type": {TYPE}, "expires_in": {TIME}}. Мы сделали это чтобы соответствовать требованиям раздела 5.1 RFC 6749.

Здесь вы можете найти изменения кода на GitHub для получения дополнительной информации и лучшего понимания.

Ответ 2

У многих людей начались проблемы после вчерашнего дня. Это связано с тем, что Facebook отказывается от поддержки v2.2 своего API. По какой-то причине их система по-прежнему перенаправляет вызовы auth, которые не используют номер версии для API 2.2. Быстрое исправление заключается в обеспечении отправки версии API с вызовом API.

Начиная с версии 2.3, Facebook также начал возвращать объекты JSON. Поэтому не забудьте изменить это и в коде.

Ответ 3

У меня была такая же проблема, здесь найдено решение Исправить facebook oauth 2017

В принципе, вам нужно расширить HttpClientHandler и декодировать ответ JSON вместо тела

Ответ 4

Вот решение для тех, кто использует писец 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);
  }

Ответ 5

Создайте новый класс и установите экстрактор в 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;
    }
}

и введите новый созданный класс, как показано ниже. Тогда getAccessToken() будет работать как ожидалось.

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