Вопрос о кнопке входа в Facebook
Я пытаюсь реализовать систему входа в систему и регистрации с Facebook. Я использую код ниже:
<div id="fb-root"></div>
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({appId: 'MYAPPIDHERE', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', function(response) {
window.location = "https://domain.com/fblogin.aspx";
});
FB.Event.subscribe('auth.logout', function(response) {
window.location.reload();
});
};
(function() {
var e = document.createElement('script');
e.type = 'text/javascript';
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
</script>
<fb:login-button autologoutlink="true" perms="email,offline_access" registration-url="https://domain.com/register_fb.aspx" />
Мне нужен совет. В настоящее время, если я захожу на Facebook, страница автоматически запускает событие 'auth.login' и перенаправляет меня в мое приложение. Это прекрасно работает, но я хотел бы предотвратить такое поведение. В идеальном мире было бы неплохо, если бы кнопка входа в Facebook запускала событие "auth.login" только при нажатии.
о чем ты думаешь? Должен ли я удалить кнопку fb: login и создать собственную кнопку, связанную с событием onclick? Если да, то есть ли хорошие примеры, которыми вы можете поделиться?
Спасибо
2 ответа
Я думаю, вы должны сохранить код, который у вас есть. Дайте fb:login-button идентификатор (скажем, id="fb_loginbutton") и оберните ваш...
window.location = "https://domain.com/fblogin.aspx";
... в нечто подобное...
var fb_loginbutton = document.getElementById('fb_loginbutton');
fb_loginbutton.onclick = function() {
window.location = "https://domain.com/fblogin.aspx";
}
(Это входит в вашу функцию Event.subscribe...auth.login.)
Таким образом, успешное действие при входе в систему не перенаправляет браузер, а просто указывает кнопку для перенаправления при нажатии.
Если кнопка Facebook не говорит правильную вещь, тогда вы можете изменить ее HTML, чтобы сказать что-то более полезное...
fb_loginbutton.innerHTML = "Click here to continue";
... или сверните свое собственное.
Надеюсь, это поможет!
Обновление мне удалось найти работоспособное решение:
<div id="fb-root"></div>
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({appId: 'MYAPPID', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('auth.login', function(response) {
login();
});
FB.getLoginStatus(function(response) {
if (response.session) {
login();
}
});
};
(function() {
var e = document.createElement('script');
e.type = 'text/javascript';
e.src = document.location.protocol +
'//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
}());
function login() {
var fb_loginbutton = document.getElementById('fb_loginbutton');
$('.fb_button_text').html('Continue to your account...');
fb_loginbutton.onclick = function() {
window.location = "https://domain.com/login_controller.aspx";
}
}
</script>
Моя страница login_controller.aspx выглядит так:
Защищенный Sub Page_Load(ByVal отправитель как объект, ByVal e как System.EventArgs) Обрабатывает Me.Load
Dim FacebookAPPID As String = "MY_FB_APP_ID"
If Request.Cookies("fbs_" & FaceBookAppID) Is Nothing Then
'Response.Redirect("error.aspx")
End If
Dim cookie As String = Request.Cookies("fbs_" & FaceBookAppID).Value
cookie = cookie.Replace("""", "")
Dim facebookValues As NameValueCollection = HttpUtility.ParseQueryString(cookie)
'Response.Write(facebookValues("access_token"))
'Response.Write("<br><br>")
'Response.Write(facebookValues("secret"))
'Response.Write("<br><br>")
'Response.Write(facebookValues("session_key"))
'Response.Write("<br><br>")
'Response.Write(facebookValues("sig"))
'Response.Write("<br><br>")
'Response.Write(facebookValues("uid"))
doLogin(facebookValues("uid").ToString)
End Sub
У меня есть один вопрос> Было бы полезно хранить какую-нибудь зашифрованную строку AES вместе с идентификатором пользователя facebook в моей базе данных? Я использую этот процесс для регистрации:
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
FB.init({appId: 'MY_APP_ID', status: true, cookie: true, xfbml: true});
};
(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>
<fb:registration fields="[{'name':'name', 'view':'prefilled'},{'name':'username', 'view':'not_prefilled', 'description':'Username','type':'text'},{'name':'password', 'view':'not_prefilled', 'description':'Password','type':'text'},{'name':'lastname', 'description':'Last name','type':'text'},{'name':'email'},{'name':'accountnumber', 'description': ' Account number','type':'text'}]" onvalidate="validate_async" redirect-uri="https://domain.com/fbregister.aspx"></fb:registration>
<script>
function validate_async(form, cb) {
tmp = form.accountnumber;
tmp = tmp.split("-");
if (tmp.length != 2) {
cb({'accountnumber': 'Please include the dash in your account number. Example: xxxxx-xxxxxx.'});
}
if (form.username) {
if (form.username.length > 0) {
$.getJSON('checkUsernameExists.aspx?username=' + form.username,
function(response) {
if (response.error) {
cb({username: 'That username is taken'});
}
cb();
});
}
} else {
cb();
}
}
</script>
Мой fbregister.aspx использует библиотеку JSON.net для анализа ответа на facebook:
Dim FBAppID As String, FBSecret As String, данные As JObject FBAppID = "MY_FB_ID" FBSecret = "MY_FB_SECRET"
data = ClientSite.Classes.Facebook.DecodeFacebookRequest(HttpContext.Current.Request.Form("signed_request"), FBSecret)
Response.Write(data)
Каковы будут лучшие практики хранения идентификатора пользователя с паролем? Я думал об использовании AES для шифрования пароля. идентификатор пользователя будет passphase, секретный файл facebook будет солью, а системный ключ будет сгенерирован как текст.
Когда кто-то пытается войти в систему с помощью Facebook, он генерирует зашифрованный пароль и сравнивает его с тем, который хранится в БД. По сути, это обеспечит дополнительный уровень безопасности. Мысли?