2012-12-02 2 views
8

나는 passport.js를 사용하여 사용자를 인증하고 있습니다. 사용자로부터 수집 한 사용자 이름을 전달하여 인증 프로세스가 끝나면 사용자를 만들 때 사용자 이름을 저장할 수 있습니다 (아직없는 경우).passport.js 체인을 통해 매개 변수를 전달하는 방법은 무엇입니까?

app.get("/auth/google", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     scope: 
     [ 
      "https://www.googleapis.com/auth/userinfo.profile", 
      "https://www.googleapis.com/auth/userinfo.email" 
     ] 
    })(request, response); 
}); 

app.get("/auth/google/callback", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     successRedirect: "/", 
     failureRedirect: "htm/error" 
    })(request, response); 
}); 

호출에/인증/구글이 사용자 이름을 인쇄하지만 콜백 인쇄 정의되지 않은 : 나는 이것을 시도했습니다. 내가 콜백에 사용자 이름을 얻을 수 있다고하더라도, 나는 아직도 어떻게 구글 전략에 그것을 얻을 것이라고 확신하지 못한다. 이 전략이 효과를 발휘할 수있는 자체 전략을 수립해야합니까?

답변

7

당신은과 같이, passport.authenticate하는 상태를 개체를 전달할 수 있습니다

passport.authenticate("google", 
{ 
    scope: 
    [ 
     "https://www.googleapis.com/auth/userinfo.profile", 
     "https://www.googleapis.com/auth/userinfo.email" 
    ], 
    state: request.query.username 
})(request, response); 

당신은 req.query.state을 통해 상태를 액세스 할 수 있습니다.

사용자 이름은 문자열이 아니라 객체 여야합니다. 상태에 객체를 저장하려면 JSON.stringify를 호출하고 이전에 콜백에서 구문 분석하십시오.

1

OpenID를 사용하는 모든 사용자는 req.query가 OpenId 쿼리 매개 변수에 의해 덮어 쓰여진 것으로 보이므로 직접 전달할 수 없습니다. 그러나 req.session에 변수를 첨부 할 수 있습니다.

router.get('/auth/social', (req, res, next) => { 
    req.session.foo = req.query.foo; 
    next(); 
}, passport.authenticate('social')); 

및 전략 옵션의 passReqToCallback 플래그를 포함하는 것을 잊지 마세요 :

{ 
    passReqToCallback: true, 
    returnURL: config.app.returnUrl, 
    realm: config.app.realm, 
    apiKey: config.app.apiKey 
} 
+0

세션과 쿠키도 오픈 ID 전략에 의해 덮어 쓸 가능성이 있습니다 (https://github.com를/liamcurry/여권 - 증기)? 나는 당신의 솔루션을 시도했지만'req.session.foo'는 콜백 라우트에서'undefined'입니다. – guest459473

관련 문제