在 javascript 代码(JavaScript、Firebase)中可见密钥?

secret key visible in javascript code (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 class 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 中的 firebase-token-generator 代码(here), installed it including dependencies in my project with 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);
        });
};

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

问题是什么,如何解决?

您应该避免在客户端浏览器中做任何事情 'secret'。在那里,秘密将是可见的,密码将可以通过 XSS 破解和嗅探,并且您可以使用某些 XSS 连接到任何用户。

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

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