【发布时间】: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