2017-01-08 2 views
1

세션이 사용되지 않는 경우 권한 부여 (기존 계정에 바인딩)를 사용하는 방법은 무엇입니까? 나는 인증 응답이 페이스 북에서 돌아온 후에 어떤 사용자가 처음에 권한을 부여하기를 원하는지를 알 수있는 방법을 찾을 수 없다. 세션이 없으면 토큰이 요청에 더 이상 존재하지 않는다는 것을 말할 수 없습니다 (사용자가 아님). 일반적으로 그들은 그 정보를 세션에서 가져옵니다. 연속 로컬 저장소을 시도했지만 여권이 현재 컨텍스트에 바인딩 할 수없는 몇 가지 내부 콜백을 작성하므로 작동하지 않습니다. 당신은 페이스 북의 전략 Passport.JS를 사용하고 지정된Passport.JS - 세션없이 인증 하시겠습니까?

http://passportjs.org/docs/authorize

답변

0

, 당신은 상태 필드를 사용할 수 있습니다. 2 개의 미들웨어를 생성해야하는데, 하나는 로그인 URI에 대한 인증을 호출하기 전에 사용하고, 다른 하나는 loginCallback URI 전에 사용해야합니다.

사용자를 올바르게 관리하려면 전략을 업데이트해야합니다. 기억하십시오. req.user를 사용할 수 없습니다.

저는 개인적으로 세션도 좋아하지 않지만, 매우 자주 사용되어 세션에 대한 인증 정보 사용 방법을 찾을 수 있습니다.

이 메소드가 세션을 비활성화하는 'authenticate'패스포트 메소드를 호출하는 방법을 확인하고 미들웨어 방식으로도 router.get (...)과 함께이 작업을 수행 할 수 있지만 확인했습니다. 그것은 애플 리케이션에서와 마찬가지로 로컬, 페이스 북 및 JWT 인증을 동시에 사용하고 일관된 패턴을 갖는 것이 좋습니다. 또한 토큰을 작성하고 저장하려는 경우 mongoDB와 같은 비동기 저장소를 사용하는 경우 콜백을 처리하는 데 문제가 발생할 수 있습니다.

설명서에 따르면 해당 endopoint를 사용하여 로컬 계정에 연결하는 경우 권한 부여를 사용해야하지만 세션이 전혀 없기 때문에 사용할 필요가 없습니다. 경로, 페이스 북에 등록하기위한 것이고, 페이스 북에 로컬 계정을 병합하려는 경우 페이스 북에 전달 된 토큰이 처음으로 연결되었는지 또는 연결할지를 결정할 수 있습니다)

둘 다 전화를 인증합니다.

function facebookTempTokenCreate(req, res, next) { 
// create the token the way you think is best, 
// I personally prefer to create a JWT and save it somewhere in the DB. 
// also you need to pass it to the next middleware by saving the value 
// in the req. name can be anything you want. 
// but make sure is quite unique as you do not want to break other libraries. 

    req.facebookConnectToken = 'that_sweet_token'; 
    next(); // dont forget to continue to next middleware. 
} 

function facebookAuthenticate(req, res, next) {   
    passport.authenticate('facebook', { 
     scope : 'email', 
     callbackURL : 'your_app_callback_uri', 
     state : req.facebookConnectToken, 
     session : false 
    })(req,res,next); 
} 

function facebookAuthenticateCallback(req, res, next) { 

    passport.authenticate('facebook', { 
     scope : 'email', 
     session : false 
    })(req,res,next); 
} 

function facebookTempTokenValidate(req, res, next) {  
    console.log('here we validate the token: ' + req.query.state); 
    next();//dont forget to pass execution to next middleware. 
} 

app.get('/facebook/login', facebookTempTokenCreate, facebookAuthenticate); 

app.get('/facebook/login/callback', facebookTempTokenValidate, facebookAuthenticateCallback); 

이 링크에서 자세한 정보를 확인할 수 있습니다. https://github.com/jaredhanson/passport-facebook/issues/14

희망이 도움이 될 수 있습니다.