zoukankan      html  css  js  c++  java
  • 【登录 / 注册 / 身份验证】

    package.json

    {
        "name": "user-auth-example",
        "version": "0.0.1",
        "dependencies": {
            "express": "2.5.9",
            "ejs": "0.4.2",
            "superagent": "0.3.0",
            "mongodb": "*",
            "jade": "0.20.3"
        }
    }

    server.js

    var express = require('express')
    var mongodb = require('mongodb')
    var ObjectId = mongodb.ObjectID
    
    var app = express.createServer()
    app.use(express.bodyParser())
    app.use(express.cookieParser())
    app.use(express.session({secret: 'my secret'}))
    app.use(function(req, res, next) {
        if (req.session.loggedIn) {
            res.local('authenticated', true)
            app.users.findOne({"_id": ObjectId(req.session.loggedIn)}, function(err, doc) {
                if (err) return next(err)
                res.local('me', doc)
                next()
            })
        } else {
            res.local('authenticated', false)
            next()
        }
    })
    
    app.set('view engine', 'jade')
    app.set('view options', {layout: false})
    
    app.get('/', function(req, res) {
        res.render('index')
    })
    
    app.get('/login', function(req, res) {
        if (req.session.loggedIn) {
            res.redirect('/')
        } else {
            res.render('login', {signupEmail: ''})
        }
    })
    
    app.get('/login/:signupEmail', function(req, res) {
        res.render('login', {signupEmail: req.params.signupEmail})
    })
    
    app.post('/login', function(req, res) {
        app.users.findOne({email: req.body.user.email, password: req.body.user.password}, function(err, doc) {
            if (err) return next(err)
            if (!doc) return res.send('User not found. Go back and try again')
            req.session.loggedIn = doc._id.toString()
            res.redirect('/')
        })
    })
    
    app.get('/logout', function(req, res) {
        req.session.loggedIn = null
        res.redirect('/')
    })
    
    app.get('/signup', function(req, res) {
        res.render('signup')
    })
    
    app.post('/signup', function(req, res, next) {
        app.users.insert(req.body.user, function(err, doc) {
            if (err) {
                return next(err)
            }
            res.redirect('/login/' + doc[0].email)
        })
    })
    
    var server = new mongodb.Server('127.0.0.1', 27017)
    new mongodb.Db('my-website', server, {w: 1}).open(function(err, client) {
        if (err) {
            throw err
        }
        console.log('33[96m + 33[39m connected to mongodb')
        app.users = new mongodb.Collection(client, 'users')
        client.ensureIndex('users', 'email', function(err) { // 不管索引是否存在,都可以调用这个命令来确保在查询前建立了索引
            if (err) throw err
            client.ensureIndex('users', 'password', function() {
                if (err) throw err
            })
            console.log('33[96m + 33[39m ensured indexes')
            app.listen(3000, function() {
                console.log('33[96m + 33[39m app listening on *:3000')
            })
        })
    })

    views/layout.jade

    doctype 5
    html
        head
            title MongoDB example
        body
            h1 My first MongoDB app
            hr
            block body

    views/index.jade

    extends layout
    block body
        if (authenticated)
            p Welcome back, #{me.email}
            a(href="/logout") Logout
        else
            p Welcome new visitor!
            ul
                li: a(href="/login") Login
                li: a(href="/signup") Signup

    views/login.jade

    extends layout
    block body
        #要缩进 模板引进来 模板body放这个
        form(action="/login", method="POST")
            fieldset
                legend Log in
                if (signupEmail)
                    #{signupEmail}
                    p Congratulations on signing up! Please login below
                p
                    label Email
                    input(name="user[email]", type="text", value=signupEmail)
                p
                    label Password
                    input(name="user[password]", type="password")
                p
                    button submit
                p
                    a(href="/") Go back

    views/signup.jade

    extends layout
    block body
        form(action="/signup", method="POST")
            fieldset
                legend Sign up
                p
                    label First
                    input(name="user[first]", type="text")
                p
                    label Last
                    input(name="user[last]", type="text")
                p
                    label Email
                    input(name="user[email]", type="text")
                p
                    label Password
                    input(name="user[password]", type="password")
                p
                    button Submit
                p
                    a(href="/") Go back

     

    var ObjectId = require('mongodb').ObjectID
    db.products.find('_id': ObjectId('51d151c6b918a71d170000c7'), function(err, doc) {})
  • 相关阅读:
    Sencha Touch id 和 itemId
    解决VS报表.rdl 显示乱码“小方块”问题
    C# 调试程序弹出 没有可用于当前位置的源代码 对话框
    解决DropDownList 有一个无效 SelectedValue,因为它不在项目列表中。这是怎么回事?
    CS0016: 未能写入输出文件“c:windowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filesdata34aae0607daa87dApp_Web_addadvice.aspx.cdcab7d2.ekhlcbjd.dll”--“目录名无效。 ”
    利用微软类库 Visual Studio International Pack 汉字转拼音
    【C#】线程之Parallel
    【C#】线程之Task
    【C#】线程协作式取消
    【C#】属性(Attribute)
  • 原文地址:https://www.cnblogs.com/jzm17173/p/3470434.html
Copyright © 2011-2022 走看看