2016-10-06 2 views
2

여권과 별도의 세션 처리를 지원하는 HTTP 서버를 구현해야합니다. 그 이유는 내 고객 (계정)과 고객 (사용자)의 두 엔티티에 대한 인증이 필요하다는 것입니다. 내 아이디어는 자체 세션 미들웨어, 다른 세션 속성, 자체 여권 인스턴스 등 자신 만의 안전한 "공간"을 사용하는 것이 었습니다. 아무튼 계정에 대한 로그인 흐름 : 나는 그것을 나누기 끝에이 줄 app.use(userPassport.session())을 추가 즉시여러 세션에서 익스프레스와 패스포트를 구성하는 방법

const express = require('express') 
const session = require('express-session') 
const Passport = require('passport').Passport 
const userPassport = new Passport() 
const accountPassport = new Passport() 
// add passport strategies 

const app = express() 
app.use(session({ 
    secret: config.session.secret, 
    //store: accountSessionStore, 
    resave: true, 
    saveUninitialized: true, 
})) 

app.use(accountPassport.initialize({ userProperty: 'account' })) 
app.use(accountPassport.session()) 

app.use(userPassport.initialize({ userProperty: 'user' })) 

: 난 그냥이 코드를 사용하여 사용자 계정에 대한 세션 저장소를 사용하지만 경우 잘 작동하고

더 이상 일하지 않아. Express 세션 미들웨어는 여러 개의 여권 인스턴스를 처리 할 수 ​​없으며 마지막 호출이 인스턴스를 덮어 쓰는 것 같습니다. 이 같은 자신의 인스턴스로 계정과 고객을 포장

:

const app1 = express() 
// register stuff for accounts 
const app2 = express() 
// register stuff for users 
const rootApp = express() 
rootApp.use(app1) 
rootApp.use(app2) 

작동하고 자신의 HTTP 서버 (및 추가 포트)를 사용하는 것이 조금 잔인한 것 같습니다하지 않았다.

답변

1

여권은 초기화 할 때 요청을 요청하기 위해 여권을 첨부한다고 생각합니다. 따라서 그러한 행동을 관찰하는 것이 좋습니다.

필자는 유사한 작업을 수행했으며 Passport의 두 인스턴스와 두 개의 라우터 (express.js 4.x)를 만들어 해결했습니다.

그런 다음 각 세션을 개별적으로 구성하고 다른 경로에 다른 여권을 첨부 할 수 있습니다.

커피 스크립트 예, 당신에게 실마리를 줄 것이다 희망 :

# 
# Apps 
# 

app     = express() 
adminApp   = express() 

# 
# Routers 
# 

apiRouter   = express.Router() 
adminRouter   = express.Router() 

# 
# Authentication 
# 
apiPassport   = new Passport() 
adminPassport  = new Passport() 

# 
# Add API auth strategies 
# 
apiPassport.use new AnonymousStrategy() 
adminPassport.use new new TwitterStrategy # ... 

adminPassport.serializeUser (user, done) -> 
    done null, user.id 
    return 

adminPassport.deserializeUser (id, done) -> 
    done null, id: id 
    return 

# 
# Configure session 
# 
app.use '/api/v1/auth*', session({ 
    name: 'sid', 
    saveUninitialized: false, 
    resave: false, 
    secret: process.env.SESSION_SECRET || 'keyboard cat', 
    store: new MongoStore(mongooseConnection: mongoose.connection) 
}) 

adminApp.use session({ 
    name: 'admin.sid', 
    saveUninitialized: false, 
    resave: false, 
    secret: process.env.SESSION_SECRET || 'keyboard cat', 
    store: new MongoStore(mongooseConnection: mongoose.connection) 
}) 

# 
# Configure passport middleware 
# 
app.use '/api*', apiPassport.initialize() 
app.use '/api*', apiPassport.session() 

adminApp.use adminPassport.initialize() 
adminApp.use adminPassport.session() 

# 
# Mount apps and routers 
# 

adminApp.use adminRouter 
app.use '/api/v1/', apiRouter 
app.use '/admin/', adminApp 
+0

을하고 하나는'(PORT)'app.listen되는 라인을 듣고 있나요? – timaschew

+0

@ timaschew 예, 더 이상 필요하지 않습니다. Express 4.0을 사용하면 각 앱/라우터를 개별적으로 구성하여 문제를 해결할 수 있습니다. 'www/bin'에 사전 생성 된 상용구가 있습니다. 최상위 수준의 앱은 단순히 요청을 하위 라우터로 전달합니다. 나는 당신이 고객 지역과 고객 지역에 귀하의 사이트를 나눌 수 있다고 생각합니다. 논리의 나머지 부분을 구성하는 방법에 관해서는 여기에 많은 유연성이 있습니다. 두 영역 모두에 대해 동일한 경로를 매핑하고 세션에서 userProperty를 사용할 수 있습니다. – Andy

+1

처음에는 경로 접두사가 다른 접미사와 일치하기 때문에 순서가 잘못되었지만 순서를 변경 한 후에 먼저/api/v1/user-auth로 시작하는 사용자를 등록하고 다른 모든 항목을 시작한 후에 '/ api/v1'을 사용하십시오. 감사! – timaschew

관련 문제