作为facebook登录过程的一部分,我如何将信息传递回我的应用程序
本文关键字:信息 应用程序 我的 过程 登录 facebook 一部分 作为 | 更新日期: 2023-09-27 18:27:00
我正在研究使用C#/.Net库包装器执行facebook登录的.Net代码。
我想在登录尝试中传递一个标识符,目的是让facebook在用户经过身份验证后将其传递回我。
我正在手动构建请求的重定向url,我尝试了以下两种方法,但都没有成功:
oAuthClient.RedirectUri =
new Uri( "http://localhost:3434/fbOAuth?token=" + HttpUtility.UrlEncode( token ) );
//fails when attempting to get access token -
//"oAuthClient.ExchangeCodeForAccessToken( code )" throws an exception.
var loginUri = oAuthClient.GetLoginUrl( new Dictionary<string, object>
{ { "state", returnUrl }, {"app_data", HttpUtility.UrlEncode(token)} } );
//doesn't pass app_data back to my application
作为facebook登录过程的一部分,你如何将参数传递给你的应用程序?
我也使用Facebook C#SDK来构建Facebook应用程序。我不使用的是他们的身份验证。根据我的经验,身份验证是整个Facebook应用程序实现中最困难的部分。很难为所有设备和浏览器做好准备。
作为服务器端OAuth设计的一部分,您可以使用state
参数将您选择的数据传递给Facebook。Facebook C#SDK选择使用state
参数来提供在完成身份验证时重定向用户的上下文。这并不是Facebook想要使用state
的方式。从…起https://developers.facebook.com/docs/authentication/:
跨站点请求伪造(CSRF)
跨站点请求伪造是一种受信任(经过身份验证和授权)的用户在不知情的情况下对网站执行操作的攻击。为了防止这种攻击,您应该在状态参数中传递一个标识符,然后验证响应上的状态参数匹配。我们强烈建议任何实现Facebook用户登录的应用程序使用此机制实现CSRF保护。
在我自己的服务器端FacebookOAuth实现中,我生成一个GUID,连接一些状态信息,如要返回的控制器,加密该字符串,并将其作为状态参数传递。
当它回来时,我解密它,然后离开。你可以做这样的事情来传递你想要的任何有状态的应用程序特定数据。
服务器端OAuth的设计非常简单,并且在上面链接的页面上有很好的文档。
我在ActionResult
中使用以下代码。请注意我对您的问题的评论,不要在重定向uri:中使用"localhost"
string returnUrl = "http://productionserver.com/account/fblogon";
#if DEBUG
returnUrl = "http://local.developmentserver.com:12345/account/fblogon"; // add this host in hostfile to 127.0.0.1
#endif
var parameters = new Dictionary<string, object> { { "response_type", "code" }, { "display", "page" } };
parameters["redirect_uri"] = returnUrl;
var url = oauth.GetLoginUrl(parameters).OriginalString;
return Redirect(url);