使用javascript创建登录代码

使用javascript创建登录代码,javascript,node.js,function,express,Javascript,Node.js,Function,Express,我正在开发一个注册系统,用户只需点击一个按钮就可以创建一个随机字符串 然后,他们可以将该字符串发送给非用户,以便他/她可以使用该字符串进行注册。新用户插入他/她的选择的用户名和密码以及他/她收到的字符串 为了实现这个场景,我正在寻找一个可以创建随机字符串的javascript函数。您可以向函数提供字符串,并可以识别它是否创建了该字符串-抛出错误 创建这样一个系统有什么建议吗?在哪里可以找到这样的功能 谢谢 编辑 这是一个封闭的后端用户组。我已经是会员了。我可以创建一个字符串并通过电子邮件、sky

我正在开发一个注册系统,用户只需点击一个按钮就可以创建一个随机字符串

然后,他们可以将该字符串发送给非用户,以便他/她可以使用该字符串进行注册。新用户插入他/她的选择的用户名和密码以及他/她收到的字符串

为了实现这个场景,我正在寻找一个可以创建随机字符串的javascript函数。您可以向函数提供字符串,并可以识别它是否创建了该字符串-抛出错误

创建这样一个系统有什么建议吗?在哪里可以找到这样的功能

谢谢

编辑

这是一个封闭的后端用户组。我已经是会员了。我可以创建一个字符串并通过电子邮件、skype、fb聊天等方式发送给我的朋友Jake。我告诉他,“输入你想要的用户名/密码,但将我发送给你的代码输入到注册表单的‘你的代码’字段,否则系统将不允许你注册”。Jake注册后,字符串不再有用,因为Jake创建了自己的密码,系统使用该密码进行识别。 情况就是这样

我坚持使用Javascript,因为我要使用node.js/express.js,所以我想无论我做什么,它都必须用Javascript编写

如果存在的话,我想我可以使用类似于
phpb-crypt
的javascript版本。或者不是。我甚至不知道如何开始,所以任何指导方针都是有用的。
谢谢

好的,既然您已经指定要使用express,这里有一些类似于解决问题的方法

首先,您需要一种生成随机字符串的方法,该字符串可以由创建它的函数识别,这是不可能的。相反,您需要节点应用程序记住此函数生成的字符串。你可以通过多种方式来实现这一点,但以下是我将概述的过程:

  • 您可以创建一个简单的express API,其中包含两个路由:/generate和/register

  • 请求/generate URL会在服务器上生成一个随机字符串,将该字符串存储在服务器上的活动代码数组中,然后返回该字符串

  • /register路径将有两部分:GET路径将返回一个HTML表单,您的朋友必须用他的代码(您已通过电子邮件发送)、新用户名和新密码填写该表单。POST路径会将此数据发送到服务器,并用活动代码数组中存储的代码检查他的代码。如果他的代码与数组中的一个代码匹配,则会创建一个用户,该用户使用他们在HTML表单中输入的凭据(否则会返回一个错误,类似于
    无效代码错误

  • 您最好创建一个HTML页面来请求/generateURL。这将包括一个按钮,该按钮附加一个函数
    onclick
    ,该函数使
    XMLHttpRequest
    异步到此URL。然后,它将返回的代码显示在
    标记中(或任何漂浮在船上的标记)

  • 当然,您还需要在/register路径上创建一个HTML表单,以便朋友使用您通过电子邮件发送的代码注册他的新帐户

  • 您需要某种数据库来存储用户凭据。它可以是简单的.json文件,也可以是更复杂的NOSQL数据库。我不会详细介绍实现这一点,但是无论您使用哪一种实现,都有很多优秀的资源

下面是您将要编写的代码的基本大纲:

路由/index.js-这将出现在您的express应用程序中

var activeKeys = [];

router.get("/", function(req, res) {
    var options = {
        root: __dirname + '/public/',
        dotfiles: 'deny',
        headers: {
            'sent-timestamp': Date.now()
        }
    };

    res.sendFile("index.html", options, function (err) {
        if (err) {
            console.log(err);
            res.status(err.status).end();
        }
        else {
            return;
        }
    });
});

router.get("/generate", function(req, res) {
    require('crypto').randomBytes(48, function(ex, buf) {
        var token = buf.toString('hex');
        activeKeys.push(token);
        res.send(token);
        return;
    });
});

router.get("/register", function(req, res) {    
    var options = {
        root: __dirname + '/public/',
        dotfiles: 'deny',
        headers: {
            'sent-timestamp': Date.now()
        }
    };

    res.sendFile("register.html", options, function (err) {
        if (err) {
            console.log(err);
            res.status(err.status).end();
        }
        else {
            return;
        }
    });
});

router.post("/register", function(req, res) {
    var validKey = keys.indexOf(req.body.code);
    if (validKey < 0) {
        res.send("invalid code error");
    }
    else {
        //here you would implement adding your newly created user to the database,
        //and then sending a success response
    }
});
var-activeKeys=[];
路由器.get(“/”,函数(req,res){
变量选项={
根目录:_dirname+'/public/',
dotfiles:“拒绝”,
标题:{
“已发送时间戳”:Date.now()
}
};
res.sendFile(“index.html”、选项、函数(err){
如果(错误){
控制台日志(err);
res.status(err.status).end();
}
否则{
返回;
}
});
});
路由器.get(“/generate”,函数(req,res){
require('crypto')。随机字节(48,函数(ex,buf){
var token=buf.toString('hex');
activeKeys.push(令牌);
res.send(令牌);
返回;
});
});
路由器.get(“/寄存器”,函数(req,res){
变量选项={
根目录:_dirname+'/public/',
dotfiles:“拒绝”,
标题:{
“已发送时间戳”:Date.now()
}
};
res.sendFile(“register.html”、选项、函数(err){
如果(错误){
控制台日志(err);
res.status(err.status).end();
}
否则{
返回;
}
});
});
路由器post(“/寄存器”,功能(req,res){
var validKey=keys.indexOf(请求主体代码);
如果(有效期<0){
res.send(“无效代码错误”);
}
否则{
//在这里,您将实现将新创建的用户添加到数据库,
//然后发送成功响应
}
});
public/index.html-默认路由,用户

<button id="generate">Generate Key</button>
<p>Mail this to your friend!</p><p id="key"></p>
<script>
    document.getElementById("generate").addEventListener("click", function(e) {
        var xhr = new XMLHttpRequest();
        xhr.addEventListener("load", function() {
          document.getElementById("key").innerHTML(this.responseText);
        });
        xhr.open("GET", "http://www.example.com/generate", true);
        xhr.send();
    });
</script>
生成密钥
把这个寄给你的朋友

document.getElementById(“生成”).addEventListener(“单击”,函数(e){ var xhr=new XMLHttpRequest(); addEventListener(“加载”,函数(){ document.getElementById(“key”).innerHTML(this.responseText); }); xhr.open(“GET”http://www.example.com/generate“,对); xhr.send(); });
public/register.html-您的朋友在这里注册了他的新帐户

<form method="post" action="/generate">
    <input placeholder="your code" name="code" type="text"></input>
    <input placeholder="username" name="username" type="text"></input>
    <input placeholder="password" name="password" type="password"></input>
    <input placeholder="confirm" name="confirm" type="password"></input>
</form>

那应该正好适合你的需要

请注意:我还没有测试过这段代码,所以不要指望复制+粘贴就能正常工作。这只是一个指南

希望这有帮助