実際にNodeJSとexpressを使ってレストフルサーバーを開発しています。API を保護するために、oauth2 プロトコルを既に実装しています。Facebook 認証を追加したいのですが、Facebook 認証をローカル認証と統合することができません。
サーバー.js
router.route('/oauth/local')
.post(oauth2Controller.token);
router.route('/oauth/facebook')
.get(passport.authenticate('facebook-token'), oauth2Controller.token);
//impossible to call oauth2Controller.token
oauth2.js
var oauth2orize = require('oauth2orize')
var User = require('../models/user');
var AccessToken = require('../models/accesstoken');
var RefreshToken = require('../models/refreshtoken');
var passport = require('passport');
var server = oauth2orize.createServer();
server.exchange(oauth2orize.exchange.password(function(application, username, password, scope, callback){
User.findOne({username: username}, function(err, user){
if (err)
return (callback(err));
if (!user)
return (callback(null, false));
user.verifyPassword(password, function(err, isMatch){
if (err)
return (callback(err));
if (!isMatch)
return (callback(null, false));
var accessToken = new AccessToken({
user: user.username,
application: application.oauth_id,
scope: '*'
});
accessToken.save(function(err){
if (err)
return (callback(err));
});
var refreshToken = new RefreshToken({
user: user.username,
application: application.oauth_id
});
refreshToken.save(function(err){
if (err)
return (callback(err));
});
callback(null, accessToken.value, refreshToken.value);
});
})
}));
server.exchange(oauth2orize.exchange.refreshToken(function(application, refreshToken, scope, callback){
RefreshToken.findOne({value: refreshToken}, function(err, token){
if (err)
return (callback(err));
if (!token)
return (callback(null, false));
var accessToken = new AccessToken({
user: token.user,
application: application.oauth_id,
scope: '*'
});
accessToken.save(function(err){
if (err)
return (callback(err));
});
callback(null, accessToken.value, refreshToken.value);
});
}));
exports.token = [
passport.authenticate(['clientBasic'], {session: false}),
server.token(),
server.errorHandler()
];
auth.js
passport.use(new FacebookTokenStrategy({
clientID: ID_CLIENT_FACEBOOK,
clientSecret: SECRET_CLIENT_FACEBOOK
},
function(accessToken, refreshToken, profile, done) {
//Do something here
done(null, profile);
}));
ローカル認証と Facebook 認証は正常に機能します。しかし、Facebook で認証された後、API のトークンを取得するために必要な情報を oauth.token に渡すことができません。