2014-09-29 4 views
1

RESTful 환경에서 여권을 설정하려고하는데 세션 데이터에 직렬화되도록 사용자를 확보 할 수 없습니다. 로그인과 가입은 훌륭합니다.RESTFUL 환경에서 NodeJs Passport 세션을 사용할 수 있습니까?

나는 다소 scotch.io에서 튜토리얼을 따르지만 RESTful API를 통해 작동하도록 조정했다. 다음과 같이

var express = require("express"); // v 4.8.5 
var cookieParser = require("cookie-parser"); // v 1.3.3 
var bodyParser = require("body-parser"); // v 1.9.0 
var session = require("express-session"); // v 1.8.2 
var passport = require("passport"); // v 0.2.1, passport-local is v 1.0.0 
var app = express(); 

require("./config/Passport")(passport); 

app.use(morgan('dev')); 

app.use(cookieParser(secret)); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended:true})); 

app.use(session({secret:secret, resave:true, saveUninitialized:true, cookie:{httpOnly: false, secure:false, maxAge:cookie_max_age}})); 

app.use(passport.initialize()); 
app.use(passport.session()); 

app.use(less(publicPath, {compiler:{compress:false}})); 
app.use(express.static(publicPath)); 

var router = express.Router(); 
require(appBase + "Routes")(router, passport); 
app.use('/api', router); 

var server = app.listen(8088); 

이제 내 라우터에 내가 로그인 경로를 정의했습니다 : 내가 할 노력하고있어

router.post("/login", function(req, res, next) 
{ 
    passport.authenticate("local-login", function(error, user, info) 
    { 
     if(error) return next(error); 
     if(!user) return response.send({success:false, message:info.message}); 
     return response.send({success:true, message:"Login successful.", user:user}); 
    })(request, response, next); 
}); 

간단히 말해서

이 내 서버 설정입니다 여기에 간략히 설명 하겠지만 사용자 직렬화 및 역 직렬화 기능에서 콘솔 추적을 얻었으므로 충돌이 발생하지 않습니다. 또한 세션 변수로 어떤 일이 벌어지고 있는지 보여주기 위해 약간의 로깅을 얻었습니다. 쿠키 정보에는 여권 변수가 있지만 비어 있습니다.

내 문제는 내가 기본적으로 사용하도록되어있는 여권을 리디렉션하는 기본 메커니즘을 사용하고 있지 않다는 것입니다.하지만 지금까지 정확히 무엇인지 정확히 파악할 수 없었습니다. . 내 두 번째 추측은 쿠키 및 세션 물건이 제대로 설정되지 않을 것입니다. scotch.io 튜토리얼은 훨씬 이전 버전의 익스프레스 용으로 작성되었으며 모든 것을 최신 상태로 변경해야했습니다.

답변

2

사용자의 편의를 위해 제공되지만 "기본 리디렉션 메커니즘"은 없습니다.

사용자 정의 콜백을 사용하고 있으므로이 문제는 req.login()을 호출하지 않아서 발생했다고 생각됩니다. 사용자 정의 콜백을 사용하는 경우, 그것은 (req.login()를 호출) 세션을 설정하고 응답을 보낼 수있는 응용 프로그램의 책임이 될 것을 in the documentation

참고 언급 한 바와 같이. 이 같은 일을한다면

그래서, 시도 :

router.post("/login", function(req, res, next) 
{ 
    passport.authenticate("local-login", function(error, user, info) 
    { 
     if(error) return next(error); 
     if(!user) return res.send({success:false, message:info.message}); 
     req.logIn(user, function(err) { 
      if(error) return next(error); 
      return res.send({success:true, message:"Login successful.", user:user}); 
     } 
    })(req, res, next); 
}); 
+0

은 내가 문서에서 뭔가 빠진 알았 :)이 마법처럼 일했다. 당신의 도움을 주셔서 감사합니다! – Alex

관련 문제