Как мне войти в систему с помощью javascript, но сохранить информацию о пользователе с помощью php/mysql?

Я создал логин на основе javascript для своего последнего приложения, и все работает нормально. Проблема в том, что я хочу хранить всех пользователей в базе данных и не знаю, как это сделать в facebook. У меня очень хорошие знания php и sql, так что это не проблема. Мне просто нужен совет о том, как безопасно хранить данные.

Процедура, которую я хочу, такова:

Вход пользователя с всплывающим окном javascript -> проверьте, существует ли идентификатор facebook в таблице mysql. если нет, сохраните с дополнительной информацией -> пользователь вошел в систему


person A B    schedule 15.09.2011    source источник
comment
Вы должны передать скрипту PHP некоторые переменные, чтобы определить, находится ли пользователь в БД или нет, так почему бы просто не использовать эти переменные, если вам нужно вставить нового пользователя?   -  person Alex    schedule 15.09.2011
comment
Идея, которая пришла мне в голову (и не удалось реализовать), состоит в том, чтобы передать идентификатор facebook + некоторый хэш по соображениям безопасности через ajax, а затем получить всю другую информацию о facebook на стороне php. Это часть безопасности, с которой мне нужна помощь.   -  person A B    schedule 15.09.2011
comment
Безопасность в каком смысле? Или: Что именно нужно сделать, чтобы защитить от злоумышленника?   -  person Alex    schedule 15.09.2011
comment
есть ли причина, по которой вы не можете просто использовать FB.getLoginStatus() как ваша аутентификация?   -  person Lix    schedule 15.09.2011
comment
1. Как я могу создать безопасный хэш для отправки с запросом ajax? Мне нужно убедиться, что FBID в строке запроса действительно принадлежит текущему пользователю. 2. Могу ли я получить доступ к этой информации пользователей fb с помощью php sdk, или требуется какой-то дополнительный шаг?   -  person A B    schedule 15.09.2011


Ответы (2)


<script type="text/javascript">
window.fbAsyncInit = function() {
    FB.init({
        appId: 'YOUR_APP_ID',
        status: true,
        cookie: true,
        oauth: true
    });
    FB.Event.subscribe('auth.login', function(response) {
        // response returns a JSON object containing data relevant to the logged in user.
        userID = response.authResponse.userID;

        // using jQuery to perform AJAX POST.
        $.post('form_handler.php', {userID: userID}, function() {
            // POST callback
        });
    });
}
</script>

Ваш файл form_handler.php необходимо настроить для получения переменной userID из $_POST. Оттуда вы можете использовать SQL, чтобы проверить, существует ли уже пользователь и т. д.

Если вы обеспокоены тем, что переменную JavaScript userID можно легко подделать, я предлагаю использовать PHP SDK в файле form_handler.php, чтобы получить текущий uid. Внутри form_handler.php здесь (в самой простой форме) вам нужно будет сделать:

<?php
require('facebook.php');
$facebook = new Facebook(array(
    'appId' => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET
));
// get the current logged in userID
$user = $facebook->getUser();

// SQL queries (check if user exists, insert, etc.)

?>

Приведенный выше код предполагает, что вы перенесли свое приложение на oAuth 2.0.

person Chaney Blu    schedule 20.09.2011
comment
@kongaraju Да, $ — это ярлык для jQuery. Так что в этом примере он мог бы также написать jQuery.post('form_handler.php, .. - person K.K. Smith; 11.12.2012

После успешного входа с помощью Facebook JS Login вызовите эту функцию testAPI().

вашJSfile.js

function testAPI() {
    console.log('Welcome!  Fetching your information.... ');
    FB.api('/me', function(response) {

        var json = JSON.stringify(response);
        setCookie("fbresponse_"+response.id, json, 1);
        facebook_response = response;
        doLocalPosiive();
        return;
        for(var propt in response){
            console.log(propt + ': ' + response[propt]);
        }
    });
}

function setCookie(c_name,value,exdays)
{
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=encodeURIComponent(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}

Функция testAPI преобразует ответ в строку JSON и сохранит его в файле cookie, а на вашей php-странице вы можете получить файл cookie и проанализировать signed_request (и проверить подписанный запрос с вашим действительным app_secret, который, я думаю, известен только вам) и декодировать JSONed Response, а затем безопасно делайте с ним все, что хотите, в своем php/mySQL.

PHPfile.php

<?php

function getSignedRequest($app_id){
    $signed_request = $_COOKIE["fbsr_{$app_id}"];
    if($signed_request){
        return $signed_request;
    } else {
        return false;
    }
}

function parseSignedRequest($signed_request, $secret){
    list($encoded_sig, $payload) = explode('.', $signed_request, 2);

    //Decode the data
    $sig = base64_url_decode($encoded_sig);
    $data = json_decode(base64_url_decode($payload), true);

    if(strtoupper($data['algorithm']) !== 'HMAC-SHA256'){
        error_log("Unknown Algorithm. Expected HMAC-SHA256");
        return null;
    }

    //Verify the signed_resquest
    $expeted_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
    if($sig !== $expeted_sig){
        error_log("Bad Signed JSON signature!");
        return null;
    }

    return $data;
}

function base64_url_decode($str){
    //$str .= str_repeat("=", (4-(strlen($str)%4)));
    return base64_decode(strtr($str, '-_', '+/')); 
}

// Please edit the next 2 lines
$app_id = "314xxxxxxxxx990";
$app_secret = "56b5eaxxxxxxxxxxxxxxxxxxx37c799";



if($fbsr = getSignedRequest($app_id)){
    $response = parseSignedRequest($fbsr, $app_secret);
    if($response['user_id']){
        $js_response = $_COOKIE["fbresponse_{$response['user_id']}"];       
        $response_array = (json_decode($js_response, true));

        //you can perform your database activities here now
    }
}

?>

Не забудьте изменить свои APP_ID и APP_SECRET. Я надеюсь, что вы или кто-то еще найдете это полезным.

person KielSoft    schedule 19.01.2013
comment
Это техника, которую я использовал в своем недавнем проекте, и она отлично работает. - person KielSoft; 03.04.2013