昨天我注意到我的网站登录已停止工作。
在过去的两个月里,这一点很有效,据我所知,我没有改变任何东西。我已尝试过以下链接,例如: - 以及更多......
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 }));
}
答案 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();
}