Я использую Facebook C # SDK и получил пример того, как настроить логин и получить некоторую информацию о пользователе для регистрации на моем веб-сайте. Тем не менее, я застрял в информации электронной почты. Это всегда ноль.
Я проверил некоторые посты, связанные здесь, но ни один не решил мою проблему. Вся необходимая информация поступает правильно, отсутствует только электронная почта и день рождения.
Мой код на частичной странице shtml выглядит так:
<div id="fb-root"></div>
<fb:login-button id="fblogin" onlogin="window.open('http://' + location.host + '/Facebook/LogOn', '_self')" perms='email'></fb:login-button>
<script>
window.fbAsyncInit = function () {
FB.init({
appId: '@Facebook.FacebookApplication.Current.AppId',
cookie: true,
xfbml: true,
oauth: true
});
function facebooklogin() {
FB.login(function (response) {
if (response.authResponse) {
// user authorized
//window.location.reload();
window.open("http://" + location.host + "/Facebook/LogOn", "_self")
} else {
// user cancelled
}
}, { scope: '@ViewBag.ExtendedPermissions' });
};
$(function () {
// make the button is only enabled after the facebook js sdk has been loaded.
$('#fblogin').attr('disabled', false).click(facebooklogin);
});
};
(function () {
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
} ());
</script>
И мой код в контроллере Facebook:
public ActionResult LogOn()
{
var fbWebContext = new FacebookWebContext(); // or FacebookWebContext.Current;
if (fbWebContext.IsAuthorized())
{
var fb = new FacebookWebClient();
dynamic me = fb.Get("me");
//Creating new User with Facebook credentials
var id = 0;
var nickname = me.first_name;
var password = "";
var email = me.email;
var picture = string.Format("http://graph.facebok.com/{0}/picture?type=large", me.id);
var thumbnail = string.Format("http://graph.facebok.com/{0}/picture?type=normal", me.id);
var fullName = me.name;
var gender = "";
if (me.gender == "male") gender = "Masculino";
if (me.gender == "female") gender = "Feminino";
var birthdate = Convert.ToDateTime(me.birthday);
//Does the user already exist?
if (DAUser.UserAlreadyExists(email))
{
ViewBag.Message = "O seu e-mail já foi cadastrado em nosso site. Por favor, cadastre outro e-mail.";
return View("~/Views/Shared/Erro.cshtml");
}
else
{
id = DAUser.Create(nickname, email, password, "facebook");
}
//Updating created user information
User user = db.User.Find(id);
TryUpdateModel(user);
user.Picture = picture;
user.Thumbnail = thumbnail;
user.Nickname = nickname;
user.FullName = fullName;
user.Gender = gender;
if (!String.IsNullOrEmpty(birthdate))
{
user.Birthdate = Convert.ToDateTime(birthdate);
}
db.SaveChanges();
Session["loginType"] = "Facebook";
return RedirectToAction("Mural", "Home");
}
else
{
ViewBag.Message = "Não foi possível completar o seu login via Facebook.";
return View("~/Views/Shared/Erro.cshtml");
}
}
Если я поставлю эти строки, как показано в примере:
[FacebookAuthorize(Permissions = ExtendedPermissions)]
if (fbWebContext.IsAuthorized(ExtendedPermissions.Split(',')))
Мое приложение перестало работать.
У кого-нибудь есть решение? O другой пример кода, чтобы получить разрешение на запрос электронной почты и дня рождения?
Редактировать
Проблема была в этой строке:
}, { scope: '@ViewBag.ExtendedPermissions' });
В моем приложении должно быть:
}, { scope: 'email,user_birthday,user_hometown' }); //alter to get permission to access user data
Я не установил область действия (perms) для доступа к Facebook ... но теперь у меня есть другой вопрос.
Моя культура DateTime - дд / мм / гггг, а день рождения в Facebook настроен как ММ / дд / гггг, я пробовал это:
var birthdate = DateTime.Parse(me.birthday, CultureInfo.CreateSpecificCulture("pt-BR"));
Потому что моя культура на бразильском, но я все еще получаю ошибку DateTime:
String was not recognized as a valid DateTime.
Кто-нибудь знает, как это решить?