带passport http的RESTful Node.js应用程序
我正在努力获得带passport http的RESTful Node.js应用程序,node.js,rest,passport.js,Node.js,Rest,Passport.js,我正在努力获得passport-http与我的应用程序一起工作,使其符合RESTful原则 现在的默认设置是浏览器用自己的提示提示用户输入用户名和密码 有了Node.js和PassportJS,是否可以使用我自己的登录表单?如果用户试图访问一个他们没有经过身份验证的页面,我会将他们重定向到该表单。或者这本身是否违反了RESTful设计的原则?这就是您在服务器文件中创建用户和密码身份验证所需的内容。您需要包括localStategy、配置passport以及使用序列化和反序列化方法。下面的方法很有
passport-http
与我的应用程序一起工作,使其符合RESTful
原则
现在的默认设置是浏览器用自己的提示提示用户输入用户名和密码
有了Node.js和PassportJS,是否可以使用我自己的登录表单?如果用户试图访问一个他们没有经过身份验证的页面,我会将他们重定向到该表单。或者这本身是否违反了RESTful设计的原则?这就是您在服务器文件中创建用户和密码身份验证所需的内容。您需要包括localStategy、配置passport以及使用序列化和反序列化方法。下面的方法很有效
var express = require("express");
var app = express();
var passport = require("passport");
var flash = require("connect-flash");
var LocalStrategy = require("passport-local").Strategy;
var mongoose = require("mongoose");
var bodyParser = require("body-parser");
var session = require("express-session");
var cookieParser = require("cookie-parser");
app.use(bodyParser.urlencoded({extended : false}));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(session({
secret : "keyboard cat",
resave : false,
saveUninitialized : true
}))
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("mongodb://localhost/passport", function(){
console.log("connected")
})
var userSchema = new mongoose.Schema({
username : String,
password : String,
})
userSchema.methods.validPassword = function(pwd){
return (this.password === pwd)
}
var User = mongoose.model("User", userSchema)
passport.use("local", new LocalStrategy(
function(username, password, done){
User.findOne({ username : username}, function(err, user){
if(err){return done(err);}
if(!user){
console.log("no user")
return done(null, false,{message : "Incorrect username."});
}
if(!user.validPassword(password)){
return done(null, false,{message : "Incorrect password."});
}
return done(null, user)
})
}))
passport.serializeUser(function(user, done){ // change done to cb
done(null, user);
})
passport.deserializeUser(function(user, done){
User.findOne(user, function(err, user){
console.log("myerr" + err)
done(err, user)
})
})
app.set("views", "./views");
app.set("view engine", "jade");
app.get("/signup", function(req, res){
res.render("signup")
})
app.post("/signup", function(req, res){
User.create({"username" : req.body.username, "password" : req.body.password}, function(err, doc){
console.log(doc);
})
res.redirect("/login")
})
app.get("/login", function(req, res){
res.render("login")
})
app.post("/login", function(req, res, next){
passport.authenticate("local", function(err, user, info){
if(err){return next(err); }
if(!user){return res.redirect("/login");}
req.logIn(user, function(err){
if(err){ return next(err);}
return res.redirect("/users/" + user.username)
})
})(req, res, next);
})
app.get("*", function(req, res){
res.send("EVERYTHANG")
})
app.listen(3000, function(){
console.log("listening on 3000")
})
login.jade:
html
head
title LogIN
body
form(method = "POST", action = "/login")
label username
input(type = "text", name = "username")
br
label password :
input(type = "text", name = "password")
button(type="submit") LogIN
signup.jade:
html
head
title signup
body
form(method = "POST", action= "/signup")
label username
input(type = "text", name = "username")
br
label password :
input(type = "text" , name = "password")
button(type="submit") Signup
这是在服务器文件中创建用户和密码身份验证所需的内容。您需要包括localStategy、配置passport以及使用序列化和反序列化方法。下面的方法很有效
var express = require("express");
var app = express();
var passport = require("passport");
var flash = require("connect-flash");
var LocalStrategy = require("passport-local").Strategy;
var mongoose = require("mongoose");
var bodyParser = require("body-parser");
var session = require("express-session");
var cookieParser = require("cookie-parser");
app.use(bodyParser.urlencoded({extended : false}));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(session({
secret : "keyboard cat",
resave : false,
saveUninitialized : true
}))
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("mongodb://localhost/passport", function(){
console.log("connected")
})
var userSchema = new mongoose.Schema({
username : String,
password : String,
})
userSchema.methods.validPassword = function(pwd){
return (this.password === pwd)
}
var User = mongoose.model("User", userSchema)
passport.use("local", new LocalStrategy(
function(username, password, done){
User.findOne({ username : username}, function(err, user){
if(err){return done(err);}
if(!user){
console.log("no user")
return done(null, false,{message : "Incorrect username."});
}
if(!user.validPassword(password)){
return done(null, false,{message : "Incorrect password."});
}
return done(null, user)
})
}))
passport.serializeUser(function(user, done){ // change done to cb
done(null, user);
})
passport.deserializeUser(function(user, done){
User.findOne(user, function(err, user){
console.log("myerr" + err)
done(err, user)
})
})
app.set("views", "./views");
app.set("view engine", "jade");
app.get("/signup", function(req, res){
res.render("signup")
})
app.post("/signup", function(req, res){
User.create({"username" : req.body.username, "password" : req.body.password}, function(err, doc){
console.log(doc);
})
res.redirect("/login")
})
app.get("/login", function(req, res){
res.render("login")
})
app.post("/login", function(req, res, next){
passport.authenticate("local", function(err, user, info){
if(err){return next(err); }
if(!user){return res.redirect("/login");}
req.logIn(user, function(err){
if(err){ return next(err);}
return res.redirect("/users/" + user.username)
})
})(req, res, next);
})
app.get("*", function(req, res){
res.send("EVERYTHANG")
})
app.listen(3000, function(){
console.log("listening on 3000")
})
login.jade:
html
head
title LogIN
body
form(method = "POST", action = "/login")
label username
input(type = "text", name = "username")
br
label password :
input(type = "text", name = "password")
button(type="submit") LogIN
signup.jade:
html
head
title signup
body
form(method = "POST", action= "/signup")
label username
input(type = "text", name = "username")
br
label password :
input(type = "text" , name = "password")
button(type="submit") Signup
REST定义了web服务。服务与用户界面无关 理论上,您应该使用诸如fiddler、firebug、postman或类似的工具来测试您的服务 您的UI选择是完全独立的 如果您需要有人能够进行身份验证,那么您将需要处理请求对用户进行身份验证的可视化表示 如果您查看passport的文档,它们显示了基本身份验证的示例:
app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login'}));
在这种情况下,如果验证成功,则将用户重定向到在网站根目录下定义的页面,否则用户将重定向到在/login提供服务的页面
无论哪种情况,登录尝试都是来自Web服务器提供的页面的post方法
REST定义了web服务。服务与用户界面无关 理论上,您应该使用诸如fiddler、firebug、postman或类似的工具来测试您的服务 您的UI选择是完全独立的 如果您需要有人能够进行身份验证,那么您将需要处理请求对用户进行身份验证的可视化表示 如果您查看passport的文档,它们显示了基本身份验证的示例:
app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login'}));
在这种情况下,如果验证成功,则将用户重定向到在网站根目录下定义的页面,否则用户将重定向到在/login提供服务的页面
无论哪种情况,登录尝试都是来自Web服务器提供的页面的post方法
对于REST,我建议您使用HTTPS的HTTP基本/摘要身份验证,您可以使用来实现:
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
realm: "Simon Area.",
file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});
// Application setup.
var app = express();
// Setup strategy.
var passport = require('passport');
passport.use(auth.passport(basic));
// Setup route.
app.get('/', passport.authenticate('http', { session: false }), function(req, res) {
res.end("Welcome to private area - " + req.user + "!");
});
或者您可以使用它,而无需:
对于REST,我建议您使用HTTPS的HTTP基本/摘要身份验证,您可以使用来实现:
// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
realm: "Simon Area.",
file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});
// Application setup.
var app = express();
// Setup strategy.
var passport = require('passport');
passport.use(auth.passport(basic));
// Setup route.
app.get('/', passport.authenticate('http', { session: false }), function(req, res) {
res.end("Welcome to private area - " + req.user + "!");
});
或者您可以使用它,而无需:
passport允许您制作自己的登录表单。您想使用本地startegy。通过使用passport,你将允许用户登录,用户将只能看到他们的数据。谷歌快速搜索返回这是你用来实现自己的登录表单。将用户名和密码从表单发布到服务器,并使用passport Local,但由于会话原因,这不是RESTful。passport允许您创建自己的登录表单。您想使用本地startegy。通过使用passport,你将允许用户登录,用户将只能看到他们的数据。谷歌快速搜索返回这是你用来实现自己的登录表单。将表单中的用户名和密码发布到服务器,并使用passport local,但由于会话的原因,这不是RESTful。我知道如何执行本地策略,但由于会话的原因,我觉得这不是RESTful。我知道如何执行本地策略,但是由于会话的原因,我觉得不是RESTful的。但是我如何使passport本地RESTful呢?如果用户必须经过身份验证,那么您必须使用某种令牌。会话只是一个令牌。这是因为您没有维护有状态连接,而是使用cookie来维护该会话。公平地说,您可以将
{session:false}
与passport local
一起使用,尽管它没有很好的文档记录。最后,我使用了jsonwebtoken
并使用passport local
处理用户身份验证,然后提供了一个自定义回调来分配web令牌。对于其他正在寻找的人,我相信有一个passport jwt
包可以简化事情。但是我如何使passport本地RESTful?如果用户必须经过身份验证,那么您必须使用某种令牌。会话只是一个令牌。这是因为您没有维护有状态连接,而是使用cookie来维护该会话。公平地说,您可以将{session:false}
与passport local
一起使用,尽管它没有很好的文档记录。最后,我使用了jsonwebtoken
并使用passport local
处理用户身份验证,然后提供了一个自定义回调来分配web令牌。对于其他正在寻找的人,我相信有一个passport jwt
包可以简化事情。