密码在JavaScript代码中可见(JavaScript,Firebase)?

时间:2015-04-28 07:02:49

标签: javascript firebase-security

我有一个函数可以在使用自定义令牌进行身份验证之前检查密码和用户是否匹配。

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);
        }
    );
}

要创建e令牌,我使用密钥实例化firebase类FirebaseTokenGenerator。喜欢

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

然而,通过这种方式,任何查看.js源代码的人都可以看到密钥。我很确定这不是应该怎么做但是什么是正确的方法呢,Firebase方式呢?

编辑:

我试图弄清楚javascript的方式,但卡在那里,所以切换回PHP。使用来自github(here)的firebase-token-generator代码,使用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我发现以下是将其嵌入我的javascript代码中的方法:

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);
        });
};

但是由于som原因,然后没有生成令牌。首先从getUser调用时,javascript createToken函数的成功和错误部分都不会执行(导致变量令牌的未定义值。然后第二次调用createToken(??)然后执行成功部分但是数据现在不包含令牌,而是包含完整的php脚本......?

问题是什么以及如何解决?

2 个答案:

答案 0 :(得分:3)

您应该避免在客户端浏览器中执行任何'secret'。在那里,秘密将是可见的,密码将通过XSS和sniffable进行攻击,您可以使用某些XSS连接到任何用户。

您应该将此部分移动到服务器端以更加安全,它可以是NodeJS,PHP或其他任何东西。 (显然是HTTPS连接)

答案 1 :(得分:0)

您必须在服务器端应用程序中执行此操作,并将生成的令牌发送到您的客户端应用程序。令牌也应该通过HTTPS发送。默认令牌到期时间为24小时。这可以改变。