使用javascript创建登录代码

时间:2015-09-11 16:30:37

标签: javascript node.js function express

我正在开发一个注册系统,用户只需按一下按钮即可创建一个随机字符串。

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

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

有关创建此类系统的任何提示,我在哪里可以找到这样的功能?

由于

修改

这是一组封闭的后端用户。我已经是会员了。我可以通过电子邮件,Skype,fb聊天等方式创建一个字符串并发送给我的朋友杰克。我告诉他,"输入你想要的任何用户名/密码,但把我发送给你的代码放到你的代码中#39;注册表单的字段,否则系统不会让你注册"。 Jake注册后,字符串不再有用,因为Jake创建了自己的密码,系统使用该密码进行识别。 这就是场景。

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

我想我可以使用php b-crypt的javascript版本,如果存在的话。或不。我甚至不知道如何开始,所以任何指南都会有用。 感谢

1 个答案:

答案 0 :(得分:2)

好的,既然您已经指定了您想使用快递,那么这就是解决问题的方法。

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

  • 您可以使用以下几个路径创建一个简单的快速API: / generate / register

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

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

  • 您最好想要创建一个HTML页面来请求 / generate 网址。这将包含一个附加函数onclick的按钮,该函数使XMLHttpRequest与此URL异步。然后它会在<p>标签中显示返回的代码(或任何漂浮在你船上的代码)。

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

  • 您需要某种数据库来存储您的用户凭据。它可能像.json文件一样简单,也可能是更复杂的NOSQL数据库。我不会详细介绍实现这个的细节,但是无论你采用哪种实现方式,都会有很多很好的资源。

以下是您编写的代码的基本概要:

routes / index.js - 这将在您的快递应用中

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

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>

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>

这应该只是满足你的需求。

请注意:我还没有测试过这些代码,所以不要复制+粘贴并让它工作。这仅作为指南

希望这有帮助!