【问题标题】:secret key visible in javascript code (JavaScript, Firebase)?javascript代码(JavaScript,Firebase)中可见的密钥?
【发布时间】:2015-07-06 21:28:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 任何类型的 javascript 验证都是不安全的,因为正如您所说,任何人都可以查看或编辑 javascript 客户端。正确的方法是使用 php,它是服务器端且安全的。我相信你做的一切都是正确的。
  • @ViperCode PHP 是服务器端,是的。安全的?嗯。它与您编写的一样安全,并且不一定是 PHP。

标签: javascript firebase-security


【解决方案1】:

您应该避免在客户端浏览器中执行任何“秘密”操作。在那里,秘密将是可见的,密码将可以通过 XSS 破解和嗅探,您可以使用一些 XSS 连接到任何用户。

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

【讨论】:

  • 您能说出在 firebase 托管的应用程序上使用 nodeJS(坚持使用 JavaScript)的代码是什么样的吗?
  • 我想代码本身不会有太大的不同,但我不知道如何确保代码在服务器端执行(使用 NodeJS)。我该如何做到这一点?
  • 在 NodeJS 上,您将拥有一个快速服务器。然后使用middleware with app.use() 拒绝未经授权的客户端。 Here is a complete example
  • 我试过了,但卡住并切换回 php。请查看我遇到的问题的问题编辑?我在本地服务器和远程(firebase)服务器上试过,都是同样的问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 2017-03-25
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多