In this week, i learned about auth with social networks ( in this case, auth with Facebook ). I created a simple API with Node.js and Passport.js ( auth API ). So, let's code !
Passport.js
Passport is authentication middleware for Node.js. Extremely flexible and modular, Passport can be unobtrusively dropped in to any Express-based web application. A comprehensive set of strategies support authentication using a username and password, Facebook, Twitter, and more.
Before code, is necessary make some configurations - get API key in Facebook Developers. I found a video explaining how to make the settings : https://www.youtube.com/watch?v=_hF099c0A9M
passes as body in the request json:
(use Postman/Insomia)
{
"access_token": "YOUR ACCESS TOKEN IN FACEBOOK DEVELOPER"
}
required dependencies
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^8.1.0",
"express": "^4.17.1",
"express-jwt": "^5.3.1",
"passport": "^0.4.0",
"passport-facebook": "^3.0.0",
"passport-facebook-token": "^3.3.0",
"mongoose": "^5.7.1"
}
project structure
├── index.js
├── passport.js
└── app
└── routes.js
└── models
└── user.js
└── .env
index.js
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
require('dotenv').config();
const app = express();
// allow your application to be consumed
app.use(cors());
// mongodb local
mongoose.connect(process.env.MONGODB_URL_DEV, {
useUnifiedTopology: true ,
useNewUrlParser : true
})
app.listen(3333, () => console.log('server on !'))
.env
MONGODB_URL_DEV=mongodb://localhost:27017/YOUR_NAME_PROJECT
PRIVATE_KEY=YOUR_KEY_PRIVATE
clientID=YOUR_CLIENT_ID
clientSecret=YOUR_CLIENT_SECRET
└── models
└── user.js
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
name : String,
facebook_id : String,
email: String,
});
module.exports = mongoose.model('AuthFacebook',UserSchema);
passport.js
const passport = require('passport');
const FacebookTokenStrategy = require('passport-facebook-token');
const User = require('./app/models/user');
require('dotenv').config();
passport.use('facebookToken', new FacebookTokenStrategy({
clientID: process.env.clientID,
clientSecret:process.env.clientSecret
}, async (accessToken, refreshToken, profile, done) => {
try {
if( await User.findOne({'facebook_id':profile.id})) return console.log('this account is already registered!')
const email = profile.emails[0].value;
const { id: facebook_id, displayName: name } = profile;
const user = await User.create({
email,facebook_id,name
})
await user.save();
console.log(user)
}catch(error){
done(error,false,error.message)
}
}));
routes.js
const express = require('express');
const router = new express.Router;
router.post('/user/signin/facebook',passport.authenticate('facebookToken',{session:false}))
module.exports = router;
Top comments (4)
hello can u explain me how to get access token automatic?
hello, i cannot res token while login with facebook
Charlatonismo cantando
hi, this line is wrong i guess "router.post('/user/signin/facebook',passport.authenticate('facebookToken',{session:false}))
"