Facebook OAuth突然停止工作



我昨天注意到我的网站的Facebook登录已经停止工作。

在过去的两个月里,这一直运作良好,据我所知,我没有改变任何东西。我已经在链接上尝试了一切,例如: - 以及更多...

ASP.NET MVC5 OWIN 脸书身份验证突然不起作用

我注意到Stack Overflow Facebook身份验证也已停止工作。

有没有人注意到这一点并找到了任何解决方案? 值得注意的是,我正在使用 azure 应用服务进行托管。 但是当我使用本地主机时也会发现这个问题。

我当前的设置如下所示...

在 Startup.Auth 中.cs

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

在下面的方法中,每次都会nullloginInfo

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

我还从不同的帖子建议中添加了一个会话"WAKEUP",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 }));
}

正如RockSheep所解释的那样。Facebook放弃了对vor API v2.2的支持。需要更新 OWIN nuget 包。

你可以在github上找到这个问题(来自Katanaproject)。

确保在 nuget 管理器中激活预发布,然后才能将 nuget 包更新到版本v3.1.0-rc1。但请注意:更新后,您需要仔细测试您的登录(也许您还有其他身份验证提供程序,如Microsoft或Google,您也应该测试它们)。

专门的

API 将版本号更改为 v2.8,API 的返回值现在采用 JSON 格式,不再在 URI 中转义。"旧"OWIN 包无法处理此更改。

[Oauth 访问令牌] 格式 - 响应格式 https://www.facebook.com/v2.3/oauth/access_token 当你回来时 将代码交换为access_token现在返回有效 JSON 而不是 被 URL 编码。此响应的新格式为 {"access_token": {TOKEN}, "token_type":{TYPE}, "expires_in":{TIME}}.我们做了这个 更新以符合 RFC 6749 的第 5.1 节。

在这里,您可以在 GitHub 上找到代码更改,以获取更多信息和更好的理解。

很多人在昨天之后开始遇到麻烦。这是由于Facebook放弃了对其API的v2.2的支持。出于某种原因,他们的系统仍然将不使用版本号的身份验证调用重定向到 2.2 API。快速解决方法是确保 API 版本随 API 调用一起发送。

从 v2.3 开始,Facebook 也开始返回 JSON 对象。因此,请确保在代码中也更改它。

我遇到了同样的问题,在这里找到了解决方案 修复脸书 oauth 2017

基本上,您需要扩展 HttpClientHandler 并解码 JSON 响应而不是正文

这是为那些使用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);
}

创建一个新类并将提取器设置为 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();
}

最新更新