2017-05-15 24 views
1

我正在为使用HapiJS和Hapi-auth-cookie策略的应用构建小型REST后端,但无法使其正常工作。我已经定义的路线是这样的:Hapi-auth-cookie设置cookie,但不会进行validationFunc调用并抛出未授权

/ - 为服务前端应用程序的一部分

/登录 - 执行MongoDB的检查用户,然后比较密码,最后试图设置cookie的

/餐馆 - 我试图与身份验证,以确保:“会话”,但不能使它工作

我定义的策略(几乎从高致病性禽流感,身份验证cookie的GitHub的PA复制过去ge),但正如我注意到,但使用console.log,在策略选项中传递的validateFunc甚至没有被调用一次。为什么?这是我的主要问题还是我的其他代码部分被破坏?

一些代码示例:

会话身份验证策略定义:

exports.register = function(server, options, next) { 
    const cache = server.cache({ segment: 'sessions', expiresIn: 3 * 24 * 60 * 60 * 1000 }); 
    server.app.cache = cache; 

    server.auth.strategy('session', 'cookie', false, { 
     password: 'password-should-be-32-characters', 
     cookie: 'lun-cookie', 
     redirectTo: false, 
     isSecure: false, 
     ttl: 20 * 1000, 
     validateFunc: function (request, session, callback) { 
      cache.get(session.sid, (err, cached) => { 

       if (err) { 
        return callback(err, false); 
       } 

       if (!cached) { 
        return callback(null, false); 
       } 

       return callback(null, true, cached.account); 
      }); 
     } 
    }); 

    return next(); 
}; 

登录方法负责设置的cookie:

login: (request, reply) => { 
    const dbQuery = { 
     email: request.payload.email 
    }; 

    UserSchema.findOne(dbQuery, (err, user) => { 
     if (err) { 
      return console.log(err); 
     } 
     if (!user) { 
      return reply(Boom.unauthorized()); 
     } 

     Bcrypt.compare(request.payload.password, user.password, (err, res) => { 
      if (err) { 
       return console.log(err); 
      } 
      if (!res) { 
       return reply(Boom.unauthorized()); 
      } 

      const sid = String(123); 
      request.server.app.cache.set(sid, { account: user }, 0, (err) => { 

       if (err) { 
        reply(err); 
       } 

       request.cookieAuth.set({ sid: sid }); 
       return reply("ok"); 
      }); 
     }) 
    }); 
} 

路由定义的策略保证:

{ 
    method: 'GET', 
    path: '/restaurants', 
    handler: controller.getRestaurants, 
    config: { 
     validate: { 
      query: { 
       list: Joi.string().allow('full').optional(), 
       type: Joi.string().valid(restaurantTypeEnum).optional(), 
      } 
     }, 
     auth: 'session', 
    } 
} 

任何想法?我已经花了两天的时间试图找出答案。

回答

0

首先,确保高致病性禽流感-AUTH-cookie被路由

之前注册的话,我会检查登录功能,实际上传递和回复一些饼干

那我就编辑“/餐厅”路由到 auth: { mode: 'try', strategy: 'session' },

并检查request.headers是否包含cookie。

如果你有它的工作,请确保你为它编写了一些单元测试。