Facebook OAuth突然停止工作

时间:2017-03-28 06:14:06

标签: facebook facebook-graph-api model-view-controller oauth owin

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

在过去的两个月里,这一点很有效,据我所知,我没有改变任何东西。我已尝试过以下链接,例如: - 以及更多......

ASP.NET MVC5 OWIN Facebook authentication suddenly not working

我注意到Stack Overflow 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”会话,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 }));
}

5 个答案:

答案 0 :(得分:13)

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

你可以找到the issue on github(来自Katanaproject)。

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

<强>技术

Api将版本号更改为v2.8,API的返回值现在为JSON格式,不再在URI中转义。老了&#39; OWIN包无法处理此更改。

  

[Oauth访问令牌]格式 - 的响应格式   你https://www.facebook.com/v2.3/oauth/access_token回来了   交换access_token的代码现在返回有效的JSON而不是   正在进行URL编码。此响应的新格式为{&#34; access_token&#34;:   {TOKEN},&#34; token_type&#34;:{TYPE},&#34; expires_in&#34;:{TIME}}。我们成功了   更新以符合RFC 6749的5.1节。

Here you can find the code-changes在GitHub上获取进一步的信息和更好的理解。

答案 1 :(得分:5)

昨天很多人开始遇到麻烦。这是由于Facebook放弃了对其API的v2.2的支持。由于某些原因,他们的系统仍然重定向不使用版本号到2.2 API的auth调用。 quickfix是为了确保通过API调用发送API版本。

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

答案 2 :(得分:2)

我遇到了同样的问题,在Fix facebook oauth 2017找到解决方案

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

答案 3 :(得分:1)

这是一个使用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);
  }

答案 4 :(得分:0)

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