2015-04-28 3 views
0

У меня есть функция, которая проверяет совпадение пароля и пользователя перед аутентификацией с использованием пользовательского токена.секретный ключ, видимый в javascript-коде (JavaScript, Firebase)?

function getUser(user, password) { 
    var usersRef = new Firebase("mydatabase/users"); 
    var userRef = usersRef.child(user); 
    userRef.once("value", 
     function getHandler(snapshot) { 
      if (snapshot.val().password == password) { 
       var token = createToken(user); 
       ref.authWithCustomToken(token, authHandler); 
      } else { 
       alert("Gebruikersnaam en code komen niet overeen"); 
      } 
     }, 
     function errorHandler(errorObject) { 
      alert("Ophalen van gebruikersgegevens is mislukt: " + errorObject.code); 
     } 
    ); 
} 

Чтобы создать электронный маркер Я экземпляр класса firebase FirebaseTokenGenerator с секретным ключом. Подобно

function createToken(user) { 
    var tokenGenerator = new FirebaseTokenGenerator("<secret key...>"); 
    var updatedObj = { 
     "uid": "custom:"+user, 
     "level": "docent" 
    } 
    return tokenGenerator.createToken(updatedObj); 

Однако таким образом секретный ключ будет виден для всех, кто смотрит в исходный код .js. Я почти уверен, что это не то, как это должно быть сделано, но как правильно это сделать, Firebase-way?

EDIT:

Я попытался выяснить яваскрипт пути для этого, но застрял там так переключился обратно на PHP. Использовал код генератора firebase-токена от github (here), установил его, включая зависимости в моем проекте, с composer и что все, кажется, работает нормально (генерируется токен).

<?php 
    include_once "FirebaseToken.php"; 

    $uid = $_POST['uid']; 
    $level = $_POST['level']; 

    $tokenGen = new Services_FirebaseTokenGenerator("<secret key>"); 
    $token = $tokenGen->createToken(array("uid" => "custom:BAAJ"), array("admin" => False)); 
    echo $token; 
?> 

Читая это SO post я обнаружил, что после будет способом встроить его в моем яваскрипте кода:

function createToken(user) { 
    $.post('php/createtoken.php', {uid: user, level: 'docent'}, function(data){ 
      //successful ajax request 
      return data; 
     }).error(function(error){ 
      alert("Create token mislukt: "+error); 
     }); 
}; 

Но сому причины маркер не генерируется тогда. При вызове из getUser сначала как часть успеха, так и ошибка функции javascript createToken вообще не выполняются (приводя к неопределенному значению для токена переменной. Затем createToken вызывается во второй раз (??), а затем выполняется часть успеха однако данные в настоящее время не содержит маркер, но полный PHP скрипт ...?

в чем проблема и как ее решить?

+0

любой тип проверки javascript небезопасен, потому что, как вы сказали, любой может видеть или редактировать клиентскую часть javascript. Правильный способ сделать это будет с php, который является серверным и безопасным. Я считаю, что вы все делаете правильно. –

+1

@ViperCode PHP - это серверная сторона, да. Secure? Эх. Он настолько же безопасен, как и вы его пишете, и не обязательно должен быть PHP. –

ответ

3

Вы должны избегать делать ничего «секрет» в браузере клиента Там секрет будет виден, пароль будет взломан через XSS и может быть взломан, и вы можете подключиться к любому пользователю с некоторым XSS.

Вы должны перенести эту часть на серверную сторону, чтобы быть более безопасным, это может быть NodeJS, PHP или что-то еще. (HTTPS-соединения, очевидно)

+0

Можете ли вы рассказать, как будет выглядеть код, используя nodeJS (придерживаясь JavaScript) в приложении с поддержкой firebase? – user1837293

+0

Я полагаю, что сам код не будет сильно отличаться, но я не знаю, как убедиться, что код выполняется на стороне сервера (используя NodeJS). Как это сделать? – user1837293

+1

На NodeJS у вас будет экспресс-сервер. Затем используйте [промежуточное программное обеспечение с app.use()] (http://expressjs.com/guide/using-middleware.html), чтобы запретить несанкционированным клиентам. [Вот полный пример] (http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport--cms-21619) –

0

Вы должны сделать это в своем приложении на стороне сервера и отправить сгенерированный токен в клиентское приложение. Маркер также должен быть отправлен через HTTPS. По умолчанию токен истекает 24 часа. Это можно изменить.

Смежные вопросы