passport-google-oauth2
と をそれぞれ使用して、FacebookとGoogleで認証しようとしていpassport-facebook
ます。
auth フォルダーのプロジェクト構造は次のようになります。
auth/facebook
index.js
login.js
verifyCallback.js
auth/google
index.js
login.js
verifyCallback.js
auth/google コードは次のようになります。
verifyCallback.js
var User = require('../../models/user');
module.exports = function(accessToken,refreshToken,profile,done){
function findOrCreateUser(){
console.log(profile);
User.findOne({'google.id':profile._json.id},function(err,user){
if(err){
console.log("An error occured when logging in with google");
console.error(err);
done(err);
}
else if(user)
{
console.log("User exists in google verify callback");
console.log(user);
done(null,user);
}
else{
console.log("Creating a new user in google verify callback");
var payload = {
google:{
token:accessToken,
email:profile._json.emails[0].value,
id:profile._json.id,
name:profile._json.displayName
}
};
console.log(payload);
var user = new User(payload);
user.save(function(err,user){
if(err)
{
console.log("Error occured when creating new user with google in verify callback");
console.error(err);
done(null);
}
else
console.log("User successfully added with google in verify callback");
done(null,user);
});
}
});
}
process.nextTick(findOrCreateUser);
};
これは、verify コールバックを戦略に適用する login.js です。
login.js
var GoogleStratgy = require('passport-google-oauth2');
var config = require('../config').google;
var callback = require('./verifyCallback');
module.exports = function(passport){
passport.use('google',new GoogleStratgy(config,callback));
};
index.js のコードは次のようになります。
index.js
var User = require('../../models/user');
var login = require('./login');
module.exports = function(passport)
{
var serializeGoogleCallback = function serializeGoogleCallback(user,done){
console.log("Serializing google user");
console.log(user);
done(null, user.google.id);
};
var deserializeGoogleCallback = function deserializeGoogleCallback(id,done){
console.log("Deserializing google user");
console.log(id);
User.findOne({'google.id':id},function(err,user){
if(err)
console.log("An error occured while deserializing user");
else
console.log(user);
done(err,user);
});
};
passport.serializeUser(serializeGoogleCallback);
passport.deserializeUser(deserializeGoogleCallback);
login(passport);
};
auth/facebook のコードは次のようになります。
index.js
var User = require('../../models/user');
var login = require('./login');
module.exports = function(passport)
{
var serializeFacebookCallback = function serializeFacebookCallback(user,done){
console.log("Serializing facebook user");
console.log(user);
done(null, user.facebook.id);
};
var deserializeFacebookCallback = function deserializeFacebookCallback(id,done){
console.log("Deserializing facebook user");
User.findOne({'facebook.id':id},function(err,user){
if(err)
{
console.log("Error occured when deserializing user");
}
else
console.log(user);
return done(err,user);
});
};
passport.serializeUser(serializeFacebookCallback);
passport.deserializeUser(deserializeFacebookCallback);
login(passport);
};
----------------------------------------------------------------------------
login.js
var config = require('../config');
var FacebookStrategy = require('passport-facebook').Strategy;
var verifyCallback = require('./verifyCallback');
module.exports = function(passport){
var fbConf = {
clientID: config.facebook.clientId,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL,
enableProof: false,
};
passport.use('facebook',new FacebookStrategy(fbConf,verifyCallback));
};
----------------------------------------------------------------------------
verifyCallback.js
var User = require('../../models/user');
module.exports = function(accessToken, refreshToken, profile, done) {
function findOrCreateUser(){
User.findOne({'facebook.id':profile.id},function(err,user){
if(err)
{
console.log("Error when finding facebook user in verify callback");
done(err);
}
if(user)
{
console.log("User has been found in facebook verify callback");
done(null,user);
}
else
{
console.log("Creating new user in facebook verify callback");
var payload = {
facebook:{
id:profile.id,
token:profile.token,
name: profile.name.givenName,
email:profile.emails[0].value
}
};
console.log(payload);
var user = new User(payload);
user.save(function(err,user){
if(err){
console.log("Error occured when creating new user in facebook verify callback");
done(err);
}
else
{
console.log("New facebook user added successfully");
done(null,user);
}
})
}
});
}
process.nextTick(findOrCreateUser);
};
これらを構成するために、app.js でこれらの両方を呼び出します。
//after setting up views,passport
require('./auth/facebook')(passport);
require('./auth/google')(passport);
//setting up login route here
app.use('/login',login);
ログインルートは次のようになります。
var router = require('express').Router();
var passport = require('passport');
router.get('/facebook',passport.authenticate('facebook',{scope:'email'}),function(req,res){
console.log('Login request sent for fb');
});
router.get('/facebook/callback',
passport.authenticate('facebook',{failureRedirect:'/',successRedirect:'/home'}),function(req,res){
});
router.get('/google',
passport.authenticate('google',
{scope:['https://www.googleapis.com/auth/plus.login',
'https://www.googleapis.com/auth/plus.profile.emails.read'
]})
,function(req,res){
});
router.get('/google/callback',
passport.authenticate('google',{successRedirect:'/home',failureRedirect:'/'}),
function(req,res){
console.log("Google auth callback");
});
router.get('basic',passport.authenticate('basic_login',{
successRedirect:'/home',failureRedirect:'/'}),
function(req,res){
});
router.get('basic/newuser',passport.authenticate('basic_signup',{
successRedirect:'/home',failureRedirect:'/'}),
function(req,res){
});
module.exports = router;
Googleでログインすると、GoogleのverifyCallbackを使用していることがわかりましたが、最初にfacebookでシリアル化および逆シリアル化し、次にgooogleのserializeUserおよびdeserializeUserメソッドでシリアル化および逆シリアル化します。
User exists in google verify callback
{ _id: 54c8958b9c04cd101c1b626e,
__v: 0,
twitter: {},
basic: {},
google:
{ token: 'ya29.CQFm2SD2KRjrweF2Jd30-IS5vL9q8aSct48PdhZiVlXAWwC-tIMg-zgqCcRfoO
gZ0HyhvrOnCFiEcg',
email: 'vamsideepak03@gmail.com',
id: '118287466982176787421',
name: 'vamsi deepak ampolu' },
facebook: {} }
Serializing facebook user
{ _id: 54c8958b9c04cd101c1b626e,
__v: 0,
twitter: {},
basic: {},
google:
{ token: 'ya29.CQFm2SD2KRjrweF2Jd30-IS5vL9q8aSct48PdhZiVlXAWwC-tIMg-zgqCcRfoO
gZ0HyhvrOnCFiEcg',
email: 'vamsideepak03@gmail.com',
id: '118287466982176787421',
name: 'vamsi deepak ampolu' },
facebook: {} }
Serializing google user
{ _id: 54c8958b9c04cd101c1b626e,
__v: 0,
twitter: {},
basic: {},
google:
{ token: 'ya29.CQFm2SD2KRjrweF2Jd30-IS5vL9q8aSct48PdhZiVlXAWwC-tIMg-zgqCcRfoO
gZ0HyhvrOnCFiEcg',
email: 'vamsideepak03@gmail.com',
id: '118287466982176787421',
name: 'vamsi deepak ampolu' },
facebook: {} }
GET /login/google/callback?code=4/axqAPv7ohMJ-GXMZogBVKXLGgr9-NtrHmVJjehA6FSI.Yj
sut3J2NE4Qcp7tdiljKKaHYQtglgI&authuser=0&num_sessions=1&session_state=d0ea095dd2
c27166100630f36550215211a2a35f..350c&prompt=none 302 1592.895 ms - 66
Deserializing facebook user
null