/// <summary>
/// Creates a Facebook session from a signed request.
/// </summary>
/// <param name="appSecret">
/// The app secret.
/// </param>
/// <param name="signedRequest">
/// The signed request.
/// </param>
/// <returns>
/// The Facebook session.
/// </returns>
internal static FacebookSession Create(IFacebookApplication settings, FacebookSignedRequest signedRequest)
{
if (settings == null)
{
throw new ArgumentNullException("settings");
}
if (signedRequest == null)
{
return(null);
}
var data = (IDictionary <string, object>)signedRequest.Data;
if (data == null)
{
return(null);
}
if (!data.ContainsKey("code") && string.IsNullOrEmpty(signedRequest.AccessToken))
{
return(null);
}
var dictionary = new JsonObject
{
{ "uid", signedRequest.UserId.ToString() }
};
if (!string.IsNullOrEmpty(signedRequest.AccessToken))
{
dictionary["access_token"] = signedRequest.AccessToken;
}
if (data.ContainsKey("code"))
{
foreach (var key in data.Keys)
{
dictionary[key] = data[key];
}
}
else
{
if (signedRequest.Expires == DateTime.MaxValue)
{
dictionary["expires"] = 0;
}
else if (signedRequest.Expires != DateTime.MinValue)
{
dictionary["expires"] = DateTimeConvertor.ToUnixTime(signedRequest.Expires);
}
if (settings != null && !string.IsNullOrEmpty(settings.AppSecret))
{
dictionary["sig"] = GenerateSessionSignature(settings.AppSecret, dictionary);
}
}
return(new FacebookSession(dictionary, settings));
}