FacebookApplication.VerifyAuthentication(_httpContext,GenerateLocalCallbackUri())在Facebook上返回null

Pix*_*Dev 6 c# model-view-controller facebook facebook-graph-api nopcommerce-3.80

我使用nopcommerce开发了一个mvc 5应用程序,我使用外部回调它使用facebook登录它正在工作,但现在它无法正常工作,我无法找到实际问题.并使用下面的代码

this.FacebookApplication.VerifyAuthentication(_httpContext, GenerateLocalCallbackUri());

并且它返回我总是null并且身份验证状态失败我在网上搜索了所有事情并按照这些步骤但仍然无法登录facebook.

我的代码在FacebookProviderAuthorizer.cs中是这样的

private AuthorizeState VerifyAuthentication(string returnUrl)
{
   var authResult = DotNetOpenAuth.AspNet.Clients.FacebookApplication.VerifyAuthentication(_httpContext, GenerateLocalCallbackUri());

   if (authResult.IsSuccessful)
   {
   }
}
Run Code Online (Sandbox Code Playgroud)

然后编写回调方法

private Uri GenerateLocalCallbackUri()
{
    string url = string.Format("{0}plugins/externalauthFacebook/logincallback/", _webHelper.GetStoreLocation());
    return new Uri(url);            
}
Run Code Online (Sandbox Code Playgroud)

然后生成服务登录URL

private Uri GenerateServiceLoginUrl()
{
   //code copied from DotNetOpenAuth.AspNet.Clients.FacebookClient file
   var builder = new UriBuilder("https://www.facebook.com/dialog/oauth");
   var args = new Dictionary<string, string>();
   args.Add("client_id", _facebookExternalAuthSettings.ClientKeyIdentifier);
   args.Add("redirect_uri", GenerateLocalCallbackUri().AbsoluteUri);
   args.Add("response_type", "token");
   args.Add("scope", "email");
   AppendQueryArgs(builder, args);
   return builder.Uri;
}
Run Code Online (Sandbox Code Playgroud)

小智 7

2017年3月27日星期一,当Facebook停止支持他们的Graph API v2.2时,我们遇到了同样的问题.

我们也使用DotNetOpenAuth,它最初是通过Nuget安装的.源代码可从以下链接获得:

https://github.com/DotNetOpenAuth/DotNetOpenAuth

具体来说,我们发现我们的代码使用的是4.3分支,其中包含DotNetOpenAuth.AspNet.DLL的源代码.在检查源代码时,我们发现问题出在DotNetOpenAuth.AspNet\Clients\OAuth2\FacebookClient.cs的代码片段中,位于QueryAccessToken方法中:

using (WebClient client = new WebClient()) {
     string data = client.DownloadString(builder.Uri);
     if (string.IsNullOrEmpty(data)) {
          return null;
     }

     var parsedQueryString = HttpUtility.ParseQueryString(data);
     return parsedQueryString["access_token"];
}
Run Code Online (Sandbox Code Playgroud)

具体来说,问题是ParseQueryString调用.从API的v2.3开始,数据不再作为HTML查询字符串返回,而是以标准JSON格式返回.

为了解决这个问题,我们创建了自己的自定义类,继承了OAuth2Client并从FacebookClient.cs导入了大部分相同的代码.然后,我们用解析JSON响应的代码替换上面的代码片段,以提取access_token,然后返回它.您可以在GetUserData方法中的同一个FacebookClient类中看到如何执行此操作的示例:

FacebookGraphData graphData;
var request =
    WebRequest.Create(
        "https://graph.facebook.com/me?access_token=" +
             MessagingUtilities.EscapeUriDataStringRfc3986(accessToken));
using (var response = request.GetResponse()) {
     using (var responseStream = response.GetResponseStream()) {
        graphData = JsonHelper.Deserialize<FacebookGraphData>(responseStream);
     }
}
Run Code Online (Sandbox Code Playgroud)

唯一的另一个变化是注册我们的自定义类来代替FacebookClient类,因此OAuth回调使用它来处理来自Facebook API的帖子.一旦我们这样做,一切都顺利进行.

  • 您好@SteveTerry可以请您提供代码如何获取访问令牌,因为我实际上无法理解. (2认同)