Tag: passport.js

Node + Express + Passport + Mongoose:req.user未定义

login时,定义了req.user,但在其他path上,req.user未定义。 也许我做错了什么,我跑出了想法。 也绝望从未被称为 server.js: var LocalStrategy = require('passport-local').Strategy; const User = require('./models/user'); const app = express(); mongoose.Promise = global.Promise; const mongoDB = 'mongodb://mlab.com:21494/tester'; mongoose.connect(mongoDB, { useMongoClient: true }) const db = mongoose.connection; db.on('error', console.error.bind(console, 'MongoDB connection error:')); app.use(function (req, res, next) { res.header('Access-Control-Allow-Credentials', 'true'); res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept, Authorization'); if […]

为每个用户使用mongodb和mongoose分开数据库

我正在使用MongoDB和mongoose来处理我的数据库需求。 我目前有这样的: mongoose.connect(secrets.db, {server:{poolSize: 1}}); mongoose.connection.on('error', function() { console.error('MongoDB Connection Error. Make sure MongoDB is running.'); }); 作为我的mongo连接。 我想改变这一点,以便每个login(使用护照)的用户都有自己的数据库。 所以当我show dbs我想看到user_ObjectID_database_name如何修改我的代码来获得这个结果? 我想要它,因为我相信它从我的研究中更安全。 我不能find任何好的指导如何做到这一点。 我相信他们是存在的,但是我已经花了4个小时,甚至连一个我能猜到的半好的也没有运气。 目前我只有一个users集合。 这是我当前的代码,当用户点击/signup为POST请求时运行。 exports.postSignup = function(req, res, next){ req.assert('email', 'Please sign up with a valid email.').isEmail(); req.assert('password', 'Password must be at least 6 characters long').len(6); var errors = req.validationErrors(); if (errors) { […]

创build帐户电子邮件validation无效

我想这样做,当用户注册我的网站,他们得到一封电子邮件,说他们需要validation他们的电子邮件使用该网站。 它目前发送带有令牌的电子邮件,但是当我去到确认链接时,它失败, status 404 。 路线 app.post('/confirmation/:token', users.confirmationPost); 需要控制器 var users = require('../controllers/users-controller'); confirmationPost exports.confirmationPost = function (req, res, next) { req.assert('email', 'Email is not valid').isEmail(); req.assert('email', 'Email cannot be blank').notEmpty(); req.assert('token', 'Token cannot be blank').notEmpty(); req.sanitize('email').normalizeEmail({ remove_dots: false }); // Check for validation errors var errors = req.validationErrors(); if (errors) return res.status(400).send(errors); // Find […]

PassportJs的passport.session()与file upload冲突 – 不会写入文件

好吧,把我的头靠在墙上。 我只是从everyauth切换到passportjs,一切都很好,除了我的Valumsfile upload器的实现。 你可以在https://gist.github.com/4066155看到我的fileuploader代码的要点 我的app.configureexpression如下所示: app.configure( function () { app.use(express.methodOverride()); app.use(express.static(__dirname + '/public')); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.set('view options', { layout: false }); app.use(passport.initialize()); app.use(passport.session()); }); 奇怪的是,如果我注释掉app.use(passport.session()); – file upload似乎工作正常。 passport.initialize可以保留,因为它不会造成任何问题。 如果我在代码中保留使用passport.session,上传调用就会通过,它实际上会在我的tmp目录中创build一个临时文件,但它保持为零字节。 服务器从不响应Web客户端(没有callback),文件从来没有真正由fs写入。 即使是一个正确的方向指针可能是非常有帮助的。 如果你需要更多的上下文,让我知道。 谢谢。 更新: 如果有帮助的话,我会分析reqvariables来查看passport.session在调用passport.session时没有被调用的差异。 第一个差异是passport.session没有被调用,第二个是被调用的。 URL: http : //diffchecker.com/Xk8g434Q – 第469行很有意思,它显示了被绑定的事件,然后在第二块文本中,事件只是{}(空)。

在手动更改路由后,mediator.user会丢失

我正在用护照本地身份validation构build一个单页面应用程序。 用户在app.post "/login"进行身份validation并返回。返回app.post "/login"后,我将其保存在Chaplin.mediator.user (如在facebook-example中所见)。 只要我不手动更改URL,一切正常,但是当我更改URL并按回车键时,应用程序会被重新加载,但使用不同的路由 – >前端没有用户。 我现在正在做的是每次我手动改变路由,我发送一个请求到服务器,并要求req.user用户。 收到用户后,应用程序继续其工作stream程。 它的工作原理,但我不认为这是如此。 如果您不等待响应,则最终没有用户对象,尽pipe您已login。 我怎么解决这个问题? 编辑:我结束了保存用户在一个单独的cookie。 这是我如何保存用户: $.cookie.json = true; $.cookie 'user', user.toJSON() 这是我加载页面后如何提取用户: userCookie = $.cookie 'user' if userCookie? mediator.user = new Model JSON.parse userCookie 你需要使用jquery-cookie插件来使其工作。 如果用户注销,请不要忘记删除Cookie。 当然,我对其他想法仍然持开放态度。

初学者node.js应用程序使用护照+ googleapis

我正在与Node.js一起尝试使用Google书籍API和护照以及Google策略进行身份validation来制作图书库应用程序。 到目前为止,我可以validation和访问API。 现在可能是一个愚蠢的问题,如何获取数据回收使用我的collections视图? 我可以在身份validation后访问Google数据,然后我需要redirect到集合,但是如何将这些数据构build到新视图中? app.get('/auth/google', passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/books', 'https://www.googleapis.com/auth/userinfo.profile'] })); app.get('/auth/google/callback', passport.authenticate('google', {failureRedirect: '/'}), function (req, res) { // Successful authentication, get data and redirect to user collection googleapis.discover('books', 'v1').execute(function (err, client) { oath2Client.credentials = { access_token: req.user.accessToken, refresh_token: req.user.refreshToken }; var req1 = client.books.mylibrary.bookshelves.list().withAuthClient(oath2Client); req1.execute(function (err, bookshelves) {}); }); res.redirect('/collection'); }); app.get('/collection', routes.collection, […]

Sails.js与护照http承载身份validation不起作用

我使用护照(本地和持证人策略)多种策略。 本地策略的login工作。 我们在login后生成一个令牌,令牌存储在redis中。 在初始login后,只要在redis中find令牌,我就想使用不带会话的承载authentication。 如果我发送正确的令牌,我可以查询redis和获取用户数据,但节点仍然发送403响应,而不是我期望的200状态码。 如果在Redis中找不到标记,则导致以下错误导致崩溃: /workspace/rs-api-sails/node_modules/redis/index.js:587 throw err; ^ Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (http.js:691:11) at ServerResponse.res.setHeader (/workspace/rs-api-sails/node_modules/sails/node_modules/express/node_modules/connect/lib/patch.js:59:22) at allFailed (/workspace/rs-api-sails/node_modules/passport/lib/passport/middleware/authenticate.js:153:13) at attempt (/workspace/rs-api-sails/node_modules/passport/lib/passport/middleware/authenticate.js:232:28) at Context.delegate.fail (/workspace/rs-api-sails/node_modules/passport/lib/passport/middleware/authenticate.js:227:9) at Context.actions.fail (/workspace/rs-api-sails/node_modules/passport/lib/passport/context/http/actions.js:35:22) at verified (/workspace/rs-api-sails/node_modules/passport-http-bearer/lib/strategy.js:125:19) at /workspace/rs-api-sails/config/bootstrap.js:40:18 at try_callback (/workspace/rs-api-sails/node_modules/redis/index.js:580:9) at RedisClient.return_reply (/workspace/rs-api-sails/node_modules/redis/index.js:670:13) 10 Dec 13:25:15 – [nodemon] app crashed – […]

PassportJS(Google OpenID)在req.user中没有任何内容

根据PassportJS文档 如果authentication成功,则将调用下一个处理程序,并将req.user属性设置为已通过身份validation的用户 但是我有这样的: passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); }); passport.use(new GoogleStrategy({ returnURL: "http://localhost:3000/auth/google/return", realm: "http://localhost:3000/" }, function(id, profile, done) { console.log("Done: ", profile); done(null, profile); })); app.get('/auth/google', passport.authenticate('google', {session: false})); app.get('/auth/google/return', passport.authenticate('google', { successRedirect: '/success', failureRedirect: '/failure', session: false })); app.get('/success', function(req, res, next) { console.log(req.user); res.send(JSON.stringify(req.user)); }); app.get('/failure', […]

如何通过多个OAuth2提供者login时减less代码重复?

我正在使用Node.js , Express , Passport , Mongoose节点模块。 用户点击sign in with provider入时有两种情况。 这是一个GitHub策略的例子: 1.如果用户已经login,请将此github帐户链接到当前login的用户。 2.如果用户没有login,请检查是否是首次使用Githublogin,或者是否是返回用户。 问:我可以使用MongoDB查询生成器或其他技术以某种方式合并这些代码吗? if (req.user) { // Already logged in. Clicked on "Link Github account" on Settings page. User.findById(req.user.id, function(err, user) { // Merge Github with local account for the current user. user.github = profile.id; user.tokens.push({ kind: 'github', accessToken: accessToken }); user.profile.name = […]

Angularjs,Expressjs和passportjs用于服务器端的身份validation检查

我有一个Node.js应用程序,我已经使用了Yeoman脚手架Angular。 我也使用ExpressJS服务器端。 所以基本上我的app结构是: app –>views –> more files server.js 结构比这更重,但这是为了保持简单。 基本上我在服务器端使用PassportJS进行身份validation。 路由目前正在通过AngularJS路由参数进行。 我现在遇到了一个问题,因为我需要使用中间件方法进行身份validation: function ensureAuthenticated(req, res, next) { console.log('authenticate=' + req.isAuthenticated()); if (req.isAuthenticated()) { return next(); } res.redirect('/') } 我在服务器端创build了一个app.get来检查用户是否试图进入pipe理页面而不login: app.get('/admin', ensureAuthenticated, function(req, res){ console.log('get admin' + req.params); res.sendfile(__dirname + '/app/views/admin/users.html'); }); 但它从来没有去的方法。 我究竟做错了什么? 任何build议将是伟大的。