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