nodejs实现登录怎么安全便捷的实现网站7天免登录功能

&1.connect中间件csrf
原理:在express框架中csrf 是通过connect 模块的中间件来解决的。其原理是在前端构造一个隐藏的表单域&_csrf& ,后端生成一个值,作为该表单域,然后在提交表单的时候,将这个值提交到后端,后端再根据这个值来比较,如果和之前的值相等的,就认为是正确的,否则就是错误的。 我们来看看代码:
module.exports = function csrf(options) {
options = options || {};
var value = options.value || defaultV
return function(req, res, next){
// already have one
var secret = req.session._csrfS
if (secret) return createToken(secret);
// generate secret
uid(24, function(err, secret){
if (err) return next(err);
req.session._csrfSecret =
createToken(secret);
// generate the token
function createToken(secret) {
// lazy-load token
req.csrfToken = function csrfToken() {
return token || (token = saltedToken(secret));
// compatibility with old middleware
Object.defineProperty(req.session, '_csrf', {
configurable: true,
get: function() {
console.warn('req.session._csrf is deprecated, use req.csrfToken() instead');
return req.csrfToken();
// ignore these methods
if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next();
// determine user-submitted value
var val = value(req);
if (!checkToken(val, secret)) return next(utils.error(403));
我们看到,直接以function(req,res,next){} 返回,在这个函数里面有一个 createToken 函数,就是生成token 的,将token的值直接绑定在请求对象req的属性上,req.csrfToken = function
我们可以直接调用这个函数,生成值,返回给页面,赋值给表单域。然后表单提交 经过checkToken 函数,比较是否相同,如果是就调用next 函数,否则直接调用utils.error(403) 了。
2. cookie_secret&
express 可以通过connect的中间件模块cookieParser 来解决
使用方法:
.use(connect.cookieParser('optional secret string'))
.use(function(req, res, next){
res.end(JSON.stringify(req.cookies));
3.paypal 的lusca 模块
这个模块很简洁,可以解决csrf,p3p,xframe,csp 等问题。使用起来很简单。
原理: csrf 是直接调用express 框架的csrf来解决的,p3p和xframe ,csp 都是设置response header 来解决的。
调用方式为:
var express = require('express'),
appsec = require('lusca'),
server = express();
server.use(appsec.csrf());
server.use(appsec.csp({ /* ... */}));
server.use(appsec.xframe('SAMEORIGIN'));
server.use(appsec.p3p('ABCDEF'));
也可以直接这么使用
server.use(appsec({
csrf: true,
csp: { /* ... */},
xframe: 'SAMEORIGIN',
p3p: 'ABCDEF'
阅读(...) 评论()nodejs如何保护API安全? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
请教:用nodejs开发一套REST API供多种客户端调用时,一般如何防止API不被未授权的访问,多谢赐教啊!
跟其他语言实现原理差不多。
谢谢,有没有例子可参照啊?其它语言的也可以。
用OAuth2,大多数的开放API平台都用这个来管理授权的。
可参考这个新浪微博关于授权机制的说明:
更多详细信息可自己上网搜索。
先理解原理,代码你自己就会写了。
简单的就用个API Key就行吧
这个API Key的安全怎莫保障?让人看到不就可以盗用了吗?服务器端还要做些什么?
看来API Key得和SSL结合起来用好些。
也提点个人意见 ,可以考虑使用账号和密码登录后返回一个TOKEN,这个TOKEN是可逆的,这样当用户提交请求时带上这个TOKEN方可正常返回结果,否则报错,至于如何验证TOKEN,这个就根据你个人喜好了
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的Express+Nodejs 下的登录拦截实现 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
原来一直不知道怎么在Express+Nodejs里面添加类似于Struts2的拦截器(因为要使用登录拦截的功能)。
以前一直以为在router这块添加类似一下的转移路由控制权代码的(每个都加很麻烦)
app.get('/show', controllers.checkLogin);//登录验证
app.get('/show', controllers.showList);//实际跳转
又或者是像某些项目里面给每个controller的方法里面加以下这种验证(太繁琐了)
if (!req.session.user) {
return res.redirect(&/login&);
最近翻到之前使用session的代码片段,突然有如茅塞顿开啊!!
//session
app.use(function (req, res, next) {
var err = req.flash('error');
var success = req.flash('success');
res.locals({
user:req.session.user,
navSide:req.session.navSide,
error:err.length ? err : null,
success:success.length ? success : null
这尼玛不就是个拦截器吗~囧~
//登录拦截器
app.use(function (req, res, next) {
var url = req.originalU
if (url != &/login& && !req.session.user) {
return res.redirect(&/login&);
经过测试,成功了
不错,我是用aop实现的
我用的是route的middleware实现的,你这个其实是实现了express的middleware,和session/bodyparser是一个级别的.
我的实现代码:
//set the authIdentity method for all the handlers.
//catch the exceptions for all the handlers.
var m = ['get','post','put','delete'];
m.forEach(function(type){
var handlers = app.routes[type];
if(handlers){
handlers.forEach(function(handler){
//TODO:need to config the excluded handler path,not the hard code.
if(handler.path !== '/' && handler.path !== '/auth'){//the '/auth' is the login url.
handler.callbacks = [authIdentity].concat(handler.callbacks);
handler.callbacks.forEach(function(callback){
var packageCallBack = function(req,res,next){
try{callback(req,res,next);}
//TODO:need to implement other logics.
if(e instanceof AppError){
res.send(e);
callback = packageCallB
我使用你这个方式在用登录拦截的时候,我放在了。app.use(express.session()); app.use(app.router);
之间,这样拦截是成功了,。但是静态的资源不能读取了。
静态资源app.use(express.static(path.join(__dirname, 'public')));放在app.use(express.session());后面登录拦截的前面,我的没问题
不懂struts, 但一般就middleware就好了。
感谢你的回复,拦截是成功了,但是新的问题出现了,session的写入始终是失败的,
我的文件配置app.js如下
`app.configure(function(){
app.set(‘port’, process.env.PORT || 3000);
app.set(‘views’, __dirname + ‘/views’);
app.set(‘view engine’, ‘ejs’);
(express.logger());
app.use(express.static(path.join(__dirname, ‘public’)));
app.use(express.favicon());
app.use(express.logger(‘dev’));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser(“keyboard cat”));
app.use(express.session());
app.use(function(req,res,next){
var url = req.originalU
if(url != “/login” && !req.session.user){
return res.redirect(&/login&);
app.use(app.router);
session的写入是在另外一个route里面,具体实现方式是:
`exports.to_login = function(req, res){
var user_name = req.body.user_
var password = req.body.
console.log(user_name);
console.log(password);
var user = {
username:user_name,
password:password
req.session.user =
res.render(“index”,{user:req.session.user});
这样之后,每次点击登陆之后都会又被拦截到登陆页面
var filter = require('./lib/filter');
判断是否已经登录如果登录了则过去,否则跳转到登录页
exports.authorize = function(req, res, next) {
if (!req.session.user_id) {
res.redirect('/admin/login');
使用session
app.use(express.cookieParser('sctalk admin manager'));
app.use(express.session());
路由控制,在需要登录验证的路由上加上filter.authorize
app.get('/admin/login',admin.login);
app.get('/admin/logout',admin.logout);
app.get('/admin/:action',filter.authorize, function(req, res, next){
if(admin[req.params.action])
admin[req.params.action](req, res, next);
res.status(404);
res.end();
最后在登录判断时候添加session即可
exports.dologin = function(req, res,next){
// 校验
req.assert('username', &用户名不能为空&).notEmpty();
req.assert('password', &密码不能为空&).notEmpty();
var errors = req.validationErrors();
if(errors && errors.length&0)
var ermsg = [];
for(var i=0;i&errors.i++)
ermsg.push(errors[i].msg);
var json={title:'管理后台-- 请先登录',error:ermsg.join(&\n&)};
res.render('admin/login', json);
var userid = req.body.
var pwd = req.body.
var ip = req.
userbiz.checkUser(userid,pwd,ip,function(err,user){
if(!!err){
var json={title:'管理后台-- 请先登录',error:err};
res.render('admin/login', json);
req.session.user_id = user.user_
req.session.user =
res.redirect(&/admin/index&);
倘若有N个路由都需要验证登录或者权限 那每个还都得添加一下filter 岂不是也很不方便
你可以表达式 一个设置满足多个路由规则的呀。
‘/admin/:action’ 是个通配符看到哇?
session的内容不应该是res.render(&index&,{user:req.session.user});这么传递的,你仔细看我帖子中第三段代码片段,另外下次发帖时希望搞好所贴代码的展示格式。session搞好后你登陆的route部分直接重定向到index就可以了,都不用传user参数
okok 不错,话说这个组件就是nodejs的过滤器吗
学习 正好想怎么弄登录呢
不是啊,自己写的
楼主看下这个/tldrio/express-group-handlers
我最近也在做这个东西,搜到了这个。
session不能写入解决了吗,我也遇到了
没登陆的时候
TypeError: Cannot read property ‘user_id’ of undefined
我是用Nodejs做server,前台和后台都用oauth2,通过access_token做登陆拦截
session 没有启用吗?
这个确实不错。。。 aop了
思路大体差不多啊
实现有些前台地址不需要登陆的验证
var needLogin = function(path){
var noLoginPath = ['/','/ajax']; //不需要登陆的地址
for(var i =0; i& noLoginPath.i++)
var item = noLoginPath[i];
if(path == item || (item + '/') == path){
//不需要登陆
module.exports = needL
app.use(function(req,res,next){
var path = req.originalU
var needLogin = require('./libs/login');
if(needLogin(path))
var login = req.session.
if(!login){
err = new Error('Not Login');
err.status = 500;
next(err);
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的}

我要回帖

更多关于 nodejs实现文件上传 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信