首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C#中解码OAuth 2.0 for Canvas signed_request?

如何在C#中解码OAuth 2.0 for Canvas signed_request?
EN

Stack Overflow用户
提问于 2010-08-08 13:54:10
回答 5查看 18.9K关注 0票数 17

我可以使用示例here成功验证Facebook canvas应用程序的签名请求,但无法解码有效负载。Facebook文档指出,signed_request中的第二个参数是一个base64url编码的JSON对象。在PHP中,使用json_decode对有效负载进行解码:

代码语言:javascript
复制
$data = json_decode(base64_url_decode($payload), true);

C#中的等价物是什么?

EN

回答 5

Stack Overflow用户

发布于 2011-12-06 06:17:22

相同的代码,但没有Json.NET依赖:

代码语言:javascript
复制
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);
}

你可以这样使用它:

代码语言:javascript
复制
public ActionResult Index()
{
    var dict = DecodePayload(Request["signed_request"].Split('.')[1]);
    return Content("Access Token: " + (string)dict["oauth_token"]);
}
票数 10
EN

Stack Overflow用户

发布于 2011-07-29 21:49:50

对不起,有点StackOverflow菜鸟,但是对于任何试图使用JohnK的方法进行解码的人来说,它工作得非常出色,对于像我和其他有base64编码问题的人来说,这只是几个实现技巧...

Json参考也可以从nuGet获得

代码语言:javascript
复制
Install-Package Newtonsoft.Json

http://developers.facebook.com/docs/guides/canvas/#auth更详细地解释了"signed_request“元素,但简单地说,当Facebook post返回时(在我的例子中是在用户注册请求之后),您可以从post获取数据,但字符串分为两部分,用'.‘分隔-因此,尝试解码"signed_request”将失败为'.’。不是Base64字符。第一部分是签名,允许您验证帖子是否来自Facebook (只有我们和他们知道要解码的sig ),第二部分是有效负载。

所以,我使用以下代码(在MVC控制器中),源代码是一个Facebook注册按钮……

代码语言:javascript
复制
<fb:registration fields="name,email"  redirect-uri="http://dev.devurlgoeshere.co.uk/Account/Register" width="530">
</fb:registration>

然后控制器代码响应注册请求

代码语言:javascript
复制
   [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();
    }

希望这对某些人有帮助,如果这本应该是编辑/反馈或其他什么,很抱歉…

票数 9
EN

Stack Overflow用户

发布于 2010-09-20 06:08:11

在Codeplex http://facebooksdk.codeplex.com上查看Facebook .Net SDK。它将为你处理所有的“脏活”。例如,我可以从控制器操作或在Page_Load上调用以下代码。

代码语言:javascript
复制
FacebookApp app = new FacebookApp();
string accessToken = app.Session.AccessToken;
long userId = app.UserId;

就是这样。你真的不需要担心facebook是如何将数据返回给你或解码它的。SDK会为您处理所有这些问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3433252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档