我可以使用示例here成功验证Facebook canvas应用程序的签名请求,但无法解码有效负载。Facebook文档指出,signed_request中的第二个参数是一个base64url编码的JSON对象。在PHP中,使用json_decode对有效负载进行解码:
$data = json_decode(base64_url_decode($payload), true);
C#中的等价物是什么?
发布于 2011-12-06 06:17:22
相同的代码,但没有Json.NET依赖:
public IDictionary<string, object> DecodePayload(string payload)
{
string base64 = payload.PadRight(payload.Length + (4 - payload.Length % 4) % 4, '=')
.Replace('-', '+').Replace('_', '/');
string json = Encoding.UTF8.GetString(Convert.FromBase64String(base64));
return (IDictionary<string, object>)new JavaScriptSerializer().DeserializeObject(json);
}
你可以这样使用它:
public ActionResult Index()
{
var dict = DecodePayload(Request["signed_request"].Split('.')[1]);
return Content("Access Token: " + (string)dict["oauth_token"]);
}
发布于 2011-07-29 21:49:50
对不起,有点StackOverflow菜鸟,但是对于任何试图使用JohnK的方法进行解码的人来说,它工作得非常出色,对于像我和其他有base64编码问题的人来说,这只是几个实现技巧...
Json参考也可以从nuGet获得
Install-Package Newtonsoft.Json
http://developers.facebook.com/docs/guides/canvas/#auth更详细地解释了"signed_request“元素,但简单地说,当Facebook post返回时(在我的例子中是在用户注册请求之后),您可以从post获取数据,但字符串分为两部分,用'.‘分隔-因此,尝试解码"signed_request”将失败为'.’。不是Base64字符。第一部分是签名,允许您验证帖子是否来自Facebook (只有我们和他们知道要解码的sig ),第二部分是有效负载。
所以,我使用以下代码(在MVC控制器中),源代码是一个Facebook注册按钮……
<fb:registration fields="name,email" redirect-uri="http://dev.devurlgoeshere.co.uk/Account/Register" width="530">
</fb:registration>
然后控制器代码响应注册请求
[HttpPost]
public ActionResult Register(object postData )
{
string requestData = Request.Form["signed_request"];
string[] splitPayload = requestData.Split('.');
string sig = splitPayload[0];
string payload = splitPayload[1];
var decodedObj = DecodePayload(payload);
// get the items from the decodedObject
string userFacebookID = decodedObj["user_id"];
// now do what you want with their FacebookID
return View();
}
希望这对某些人有帮助,如果这本应该是编辑/反馈或其他什么,很抱歉…
发布于 2010-09-20 06:08:11
在Codeplex http://facebooksdk.codeplex.com上查看Facebook .Net SDK。它将为你处理所有的“脏活”。例如,我可以从控制器操作或在Page_Load上调用以下代码。
FacebookApp app = new FacebookApp();
string accessToken = app.Session.AccessToken;
long userId = app.UserId;
就是这样。你真的不需要担心facebook是如何将数据返回给你或解码它的。SDK会为您处理所有这些问题。
https://stackoverflow.com/questions/3433252
复制相似问题