2011-01-01 26 views
5

Câu hỏi của tôi rất giống this nhưng tôi đoán tôi cần phải thực hiện thêm một bước nữa.Đọc OAuth2.0 Signed_Request Đăng ký Facebook C# MVC

Facebook nói "Dữ liệu được chuyển đến ứng dụng của bạn dưới dạng yêu cầu đã ký. Tham số signed_request là cách đơn giản để đảm bảo dữ liệu bạn nhận được là dữ liệu thực tế được gửi bởi Facebook".

Sau khi người dùng đăng nhập vào trang aspC# MVC của tôi và nhấp vào "Đăng ký", url chuyển hướng là http://site/account/register. Tại thời điểm đó (bài đăng vào tài khoản/kiểm soát đăng ký), tôi muốn thu thập thông tin của người dùng bằng cách sử dụng yêu cầu đã ký để tôi có thể đăng ký chúng với trang web của tôi cục bộ. Tôi không thể tìm ra cách truy cập dữ liệu facebook.

$data = json_decode(base64_url_decode($payload), true); 

Tương đương trong C# là gì? Loại biến/dữ liệu nào đang chuyển qua facebook trong bài đăng? Và làm cách nào để truy cập "$ payload"?

[HttpPost] 
    public ActionResult RegisterFacebook(RegisterFacebookModel model) 
    { 
     Facebook.FacebookSignedRequest sr = Facebook.FacebookSignedRequest.Parse("secret", model.signed_request); 

     return View(model); 
    } 

Trả lời

8

Đây là mã chúng tôi đã sử dụng trong SDK C# của Facebook. Bạn không cần phải làm điều này bằng tay nếu bạn sử dụng sdk của chúng tôi, nhưng nếu bạn cần phải làm điều đó cho mình ở đây là:

/// <summary> 
/// Parses the signed request string. 
/// </summary> 
/// <param name="signedRequestValue">The encoded signed request value.</param> 
/// <returns>The valid signed request.</returns> 
internal protected FacebookSignedRequest ParseSignedRequest(string signedRequestValue) 
{ 
    Contract.Requires(!String.IsNullOrEmpty(signedRequestValue)); 
    Contract.Requires(signedRequestValue.Contains("."), Properties.Resources.InvalidSignedRequest); 

    string[] parts = signedRequestValue.Split('.'); 
    var encodedValue = parts[0]; 
    if (String.IsNullOrEmpty(encodedValue)) 
    { 
     throw new InvalidOperationException(Properties.Resources.InvalidSignedRequest); 
    } 

    var sig = Base64UrlDecode(encodedValue); 
    var payload = parts[1]; 

    using (var cryto = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(this.AppSecret))) 
    { 
     var hash = Convert.ToBase64String(cryto.ComputeHash(Encoding.UTF8.GetBytes(payload))); 
     var hashDecoded = Base64UrlDecode(hash); 
     if (hashDecoded != sig) 
     { 
      return null; 
     } 
    } 

    var payloadJson = Encoding.UTF8.GetString(Convert.FromBase64String(Base64UrlDecode(payload))); 
    var data = (IDictionary<string, object>)JsonSerializer.DeserializeObject(payloadJson); 
    var signedRequest = new FacebookSignedRequest(); 
    foreach (var keyValue in data) 
    { 
     signedRequest.Dictionary.Add(keyValue.Key, keyValue.Value.ToString()); 
    } 

    return signedRequest; 
} 

/// <summary> 
/// Converts the base 64 url encoded string to standard base 64 encoding. 
/// </summary> 
/// <param name="encodedValue">The encoded value.</param> 
/// <returns>The base 64 string.</returns> 
private static string Base64UrlDecode(string encodedValue) 
{ 
    Contract.Requires(!String.IsNullOrEmpty(encodedValue)); 

    encodedValue = encodedValue.Replace('+', '-').Replace('/', '_').Trim(); 
    int pad = encodedValue.Length % 4; 
    if (pad > 0) 
    { 
     pad = 4 - pad; 
    } 

    encodedValue = encodedValue.PadRight(encodedValue.Length + pad, '='); 
    return encodedValue; 
} 

Bạn có thể tìm thấy mã nguồn đầy đủ ở đây: http://facebooksdk.codeplex.com/SourceControl/changeset/view/f8109846cba5#Source%2fFacebook%2fFacebookApp.cs

+0

Cảm ơn bạn đã trả lời của bạn, Nathan. Tôi đã thiếu thời gian và chưa có cơ hội thử nghiệm lần nữa, nhưng những gì bạn cho thấy có ý nghĩa. Tôi cũng sẽ xem SDK. – Josh

+0

Tôi đoán tôi vẫn không hiểu cách triển khai bằng cách sử dụng (hoặc SDK) này. Sign_request có được gửi dưới dạng bài đăng tới uri chuyển hướng trong fb: mã đăng ký không? Tôi đang sử dụng SDK js để đăng nhập/đăng ký, nhưng sau đó cố gắng sử dụng FacebookAPI mà bạn đã tham chiếu để tích hợp sâu hơn khi công cụ thành viên được xử lý. Tôi nghĩ rằng nếu tôi có thể vượt qua thời điểm này, tôi sẽ tốt ... Tôi chỉ treo lên. Tôi đang xây dựng một dự án MVC và cố gắng trỏ đến cuộc gọi đăng ký tại một trình xử lý http, nhưng sau đó cần phải giải mã đối tượng json mà fb được cho là gửi đi. Nhưng tôi không nhận được bất cứ điều gì trở lại. – Josh

+0

Nathan - tôi có thể yêu cầu theo dõi nhanh bây giờ rằng tôi đang sử dụng SDK - tôi thấy tất cả các tham số từ signed_request ngoại trừ tham số "Đăng ký". (ví dụ: "đăng ký": { "tên": "Paul Tarjan" ... tôi có làm gì sai không? Khi tôi đăng lên trang kiểm tra facebook tôi thấy chúng, nhưng chúng không có sẵn sau khi thực hiện giải mã SDK . "email": "[email protected]", "vị trí": { "tên": "San Francisco, California", "id": 114952118516947 }, – Josh

1

Dựa trên nhận xét của bạn, có vẻ như bạn vẫn đang tìm phản hồi mà FB đang gửi. Tôi tin rằng nó có trong bộ sưu tập Biểu mẫu trong đối tượng Yêu cầu HttpContext. Vì vậy, từ trang bạn chỉ định khi chuyển hướng, bạn sẽ có thể kéo nó từ:

HttpContext.Current.Request.Form ("signed_request")

Hy vọng rằng sẽ giúp làm sáng tỏ. Tôi vẫn đang học như tôi đi vì vậy đây có thể không phải là giải pháp tốt nhất.

cảm ơn, Jason

+0

Cảm ơn, Jason. Tôi đang làm việc trên một dự án MVC, vì vậy HttpContext không có sẵn trong môi trường điều khiển, nhưng tôi đã tìm ra cách kết hợp hai câu trả lời và làm cho nó chủ yếu hoạt động! Sử dụng Facebook-SDK giúp bạn dễ dàng xử lý "signed_request" trả về. – Josh

1

Dưới đây là làm thế nào để làm điều đó bằng Facebook SDK

var parsedSignedRequest = FacebookSignedRequest.Parse(FacebookApplication.Current, signed_request); 
+4

đây là lỗi thời nếu bạn đang sử dụng Facebook SDK v6. Bây giờ nó là 'var fb = new FacebookClient(); dynamic signedRequest = fb.ParseSignedRequest ("app_secret", Request.Params ["signed_request"]); ' –

Các vấn đề liên quan