2013-08-26 2 views
2

다음 코드를 입력했는데 0.0.0.0:3000/user?apikey=xxx을 입력 할 때마다 로컬 전략 내의 코드가 실행되지 않고 "인증되지 않은"페이지로 바로 이동합니다. passport.authenticate를 제거하려고했는데 server.get('/user')에서. 디버그 모드에서 매개 변수 맵을 요청하기 위해 'apikey'가 구문 분석 된 것을 볼 수 있습니다. 그래서 문제는 여권이 요청을 인증 할 수 없다는 것입니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!restify.js + passport.js가 GET 요청을 인증하지 않음

var restify = require('restify'); 
// Create server 
var server = restify.createServer({ 
    name: 'server' 
}); 
server.use(restify.queryParser()); 
server.use(restify.bodyParser()); 


var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function (apikey, done) { 
     console.log('Entered authentication.'); 
     done(null, null); 
    } 
)); 


//specify route 
server.get('/user', passport.authenticate('local'), function (req, res) { 
    console.log(req.params); 
    res.end('haha'); 
}); 

server.listen(3000, function() { 
    console.log('%s listening at %s', server.name, server.url) 
}); 

답변

4

LocalStrategy는 사용자 이름과 암호를 통해 사용자를 인증하는 데 사용됩니다. 전달 된 함수에는 사용자 이름, 비밀번호 및 완료 콜백이라는 3 개의 인수가 필요합니다. 귀하의 기능은 두 apikey 걸리고 완료.

이 전략은 요청에 게시 된 자격 증명 (예 : 로그인 페이지)을 통해 사용자를 인증하므로 세션을 사용하는 경우 유용합니다. 다른 한편으로는 URL의 apikey 문자열을 통해 모든 GET 요청을 인증해야합니다. 대신 인증을위한 미들웨어를 작성해야합니다.

server.use(function(req,res,next){ 
    key=req.query['apikey']; //get key from url 
    //authenticate it 
    if(valid(key)) 
    next(); 
    else 
    res.redirect('/unauthorized'); 
}); 

라우터 전에 사용하십시오.

+0

내 REST API에 대한 인증을 추가하고 싶었 :

var restify = require('restify'), userId = process.env.serviceID, pwd = process.env.servicePassword, passport = require('passport'), BasicStrategy = require('passport-http').BasicStrategy; passport.use(new BasicStrategy( function (username, password, done) { findByUsername(username, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } if (user.password !== password) { return done(null, false, { message: 'Incorrect password.' }); } return done(null, user); }); } )); var users = [ { id: 1, username: userId, password: pwd} ]; function findByUsername(username, fn) { for (var i = 0, len = users.length; i < len; i++) { var user = users[i]; if (user.username === username) { return fn(null, user); } } return fn(null, null); } exports.authenticate = function (req, res, next, callback) { passport.authenticate('basic', function (err, user) { if (err) { console.log(err); return next(err); } if (!user) { var error = new restify.InvalidCredentialsError("Failed to authenticate to ma-services."); console.log(error); res.send(error); return next(); } callback(req, res, next); })(req, res, next); }; 

나는 단지 내 보낸 API에서 다음은 서버가 호출 것을 호출 할 그것을 호출합니다. 솔루션 (토큰 서버, openid, passport.js 등)을 찾고 있었지만 아무 것도 간단하지 않고 액세스 할 수있었습니다. 노드의 미들웨어에 대한 나의 무지가 유죄입니다. 귀하의 솔루션은 매우 간단하고 접근 가능합니다. 감사합니다. – enguerran

+1

URL에 열쇠가 있으면 중간 공격을받은 사람에게 취약하지 않습니까? SSL이 필요하지 않습니까? –

0

다른 방법은 HTTP 기본 인증을 사용하는 것입니다. 이렇게하면 URI의 일부가 아닌 인증 헤더에서 사용자 ID/비밀번호가 전송됩니다. 이는 서비스 보안에 대한 일반적인 접근 방식이므로 (HTTPS를 통해이를 확인하십시오). 나는이 작은 모듈을 작성하여 passport-http의 일부 예제에서 부분적으로 빌려 온 것을 정확하게 작성했습니다.

var basicAuth = require(__dirname + '/../utils/authn.js'); 
exports.count = function (req, res, next) { 
    basicAuth.authenticate(req, res, next, function() { 
     validateParam(req.params.uid, next); 
     var url = '/count/' + encodeURIComponent(req.params.uid); 

     processRequest(req, res, next, url); 
    }); 
}; 
관련 문제