我正在尝试掌握 Facebook SDK,同时从 ASP.NET 表单过渡到 MVC(最终)。所以请耐心等待..
我创建了两个控制器操作:
当用户单击表单上的 FB 登录按钮时,将执行 FBLogon。
然后他被重定向到 FB 登录页面。
然后,他被发送回 FBAuthorize 页面,该页面应该解析返回的 url 以获取访问令牌。我得到类似的东西:
我看到的问题是,由于 access_token 在 # 后面传递,asp.net 无法在服务器上解析它。我做错了什么根本性的事情吗?
代码如下:
public ActionResult FBLogon()
{
var settings = ConfigurationManager.GetSection("facebookSettings");
IFacebookApplication current = null;
if (settings != null)
{
current = settings as IFacebookApplication;
if (current.AppId == "{app id}" || current.AppSecret == "{app secret}")
{
return View();
}
}
string[] extendedPermissions = new[] { "publish_stream", "offline_access" };
var oauth = new FacebookOAuthClient { ClientId = current.AppId, RedirectUri = new Uri("http://localhost:5000/account/FBAuthorize") };
var parameters = new Dictionary<string, object>
{
{ "response_type", "token" },
{ "display", "page" }
};
if (extendedPermissions != null && extendedPermissions.Length > 0)
{
var scope = new StringBuilder();
scope.Append(string.Join(",", extendedPermissions));
parameters["scope"] = scope.ToString();
}
var loginUrl = oauth.GetLoginUrl(parameters);
return Redirect(loginUrl.ToString());
}
public ActionResult FBAuthorize()
{
FacebookOAuthResult result;
if (FacebookOAuthResult.TryParse(Request.Url, out result))
{
if (result.IsSuccess)
{
var accesstoken = result.AccessToken;
}
else
{
var errorDescription = result.ErrorDescription;
var errorReason = result.ErrorReason;
}
}
return View();
}
好的。 Facebook 文档说得很清楚:
因为传入了access token
一个 URI 片段,只有客户端代码
(例如 JavaScript 在
托管网络的浏览器或桌面代码
控制)可以检索令牌。应用程序
身份验证是通过验证来处理的
该redirect_uri是在同一个
域作为配置的站点 URL
开发者应用程序
from http://developers.facebook.com/docs/authentication/ http://developers.facebook.com/docs/authentication/---> 客户端流程部分。
所以我将令牌发送回我的服务器以完成身份验证。
Update:
我使用 Javascript 发送回服务器,如下所示:
var appId = "<%: Facebook.FacebookContext.Current.AppId %>";
if (window.location.hash.length > 0) {
accessToken = window.location.hash.substring(1);
var url = window.location.href.replace(/#/, '?');
window.location = url;
}
在服务器上,我执行以下操作。不太好,但它有效..
public ActionResult FBAuthorize()
{
FacebookOAuthResult result = null;
string url = Request.Url.OriginalString;
/// hack to make FacebookOuthResult accept the token..
url = url.Replace("FBAuthorize?", "FBAuthorize#");
if (FacebookOAuthResult.TryParse(url, out result))
{
if (result.IsSuccess)
{
string[] extendedPermissions = new[] { "user_about_me", "offline_access" };
var fb = new FacebookClient(result.AccessToken);
dynamic resultGet = fb.Get("/me");
var name = resultGet.name;
RegisterModel rm = new Models.RegisterModel();
rm.UserName = name;
rm.Password = "something";
rm.Email = "somethig";
rm.ConfirmPassword = "23213";
//Label1.Text = name;
//Response.Write(name);
//return RedirectToAction("register", "Account", rm);
ViewData["Register"] = rm;
return RedirectToAction("Register");
}
else
{
var errorDescription = result.ErrorDescription;
var errorReason = result.ErrorReason;
}
}
return View();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)