
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 inFacebook 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
constexpress=require('express');constmongoose=require('mongoose');constcors=require('cors');require('dotenv').config();constapp=express();// allow your application to be consumedapp.use(cors());// mongodb localmongoose.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_PROJECTPRIVATE_KEY=YOUR_KEY_PRIVATEclientID=YOUR_CLIENT_IDclientSecret=YOUR_CLIENT_SECRET
└── models
└── user.js
constmongoose=require('mongoose');constUserSchema=newmongoose.Schema({name:String,facebook_id:String,email:String,});module.exports=mongoose.model('AuthFacebook',UserSchema);
passport.js
constpassport=require('passport');constFacebookTokenStrategy=require('passport-facebook-token');constUser=require('./app/models/user');require('dotenv').config();passport.use('facebookToken',newFacebookTokenStrategy({clientID:process.env.clientID,clientSecret:process.env.clientSecret},async(accessToken,refreshToken,profile,done)=>{try{if(awaitUser.findOne({'facebook_id':profile.id}))returnconsole.log('this account is already registered!')constemail=profile.emails[0].value;const{id:facebook_id,displayName:name}=profile;constuser=awaitUser.create({email,facebook_id,name})awaituser.save();console.log(user)}catch(error){done(error,false,error.message)}}));
routes.js
constexpress=require('express');constrouter=newexpress.Router;router.post('/user/signin/facebook',passport.authenticate('facebookToken',{session:false}))module.exports=router;
Top comments(4)
For further actions, you may consider blocking this person and/orreporting abuse