Estoy tratando de configurar alguna autenticación de usuario y quiero usar OAuth2.0 de Google para hacerlo.
Hasta ahora, configuré un proyecto API de Google en console.cloud.google.com y obtuve un ID de cliente y un secreto de cliente de OAuth 2.0 (digamos clientID = 'myID.apps.googleusercontent.com' y clientSecret = 'mySecret' ) . Buscando, descubrí que debería usar el passport y me gustaría usar passport-google-oauth20 (solo porque tiene la mayor cantidad de descargas, si hay algo mejor, POR FAVOR hágamelo saber). Siguiendo las instrucciones, tengo:
.env.js
module.exports = { google: { clientID: 'myID.apps.googleusercontent.com', clientSecret: 'mySecret' } } app.js
const express = require('express') const passport = require('passport') const env = require('./.env.js') const app = express() const baseURL = 'https://api.mywebsite.com' var GoogleStrategy = require('passport-google-oauth20').Strategy; passport.use(new GoogleStrategy({ clientID: env.google.clientID, clientSecret: env.google.clientSecret, callbackURL: baseURL + "/auth/google/callback" }, function(accessToken, refreshToken, profile, cb) { User.findOrCreate({ googleId: profile.id }, function (err, user) { return cb(err, user); }) } )) app.get('/auth/google', passport.authenticate('google', {scope: ['profile']}) ) app.get('/auth/google/callback', passport.authenticate('google', {failureRedirect: '/login'}), (req, res) => { // Successful authentication, redirect home. res.redirect('/'); } ) Cuando inicio el servidor y voy a https://api.mywebsite.com/auth/google , me redirigen a https://accounts.google.com/signin/oauth/error?authError=some_mess&client_id=myID.apps.googleusercontent.com con un Error 400: redirect_uri_mismatch y referencia a redirect_uri: http://127.0.0.1:5000/auth/undefined/auth/google/callback en los detalles. Cuando reviso Google Console, permito explícitamente https://api.mywebsite.com en los orígenes de JavaScript autorizados y todo https://api.mywebsite.com , https://api.mywebsite.com/auth/google/callback y http://127.0.0.1:5000/auth/undefined/auth/google/callback en las URI de redirección autorizadas.
¿Cómo puedo configurar todo esto correctamente?
Bonificación: si quisiera ejecutar una verificación de validez (digamos, asegurarse de que el usuario esté en una base de datos), ¿cómo podría hacerlo?
Puede configurar google oauth2.0 correctamente de la siguiente manera:
const express = require('express') const passport = require('passport') const googleStrategy = require('passport-google-oauth20').Strategy; const env = require('./.env.js') const users =require('./../database/models/User'); //change this const app = express() //serialize user passport.serializeUser((user,done)=>{ done(null,user._id); }) //deserialize user //on the every request deserialize function checks user whether in database passport.deserializeUser((id,done)=>{ users.findOne({_id:new objectId(id)},(err,doc)=>{ if(err){return done(err)}; if(!doc){return done(null,false)} return done(null,doc); }) }) //GOOGLE STRATEGY passport.use(new googleStrategy({ clientID: env.google.clientID, clientSecret:env.google.clientSecret, callbackURL:'https://api.mywebsite.com/auth/google/callback', //change this passReqToCallback : true },function(request,accessToken, refreshToken, profile, callback){ users.findOneAndUpdate({profile_id:profile.id},{ $setOnInsert:{ //your data that will insert when object is not found }, $set:{last_login:new Date() //if user exists update this field //or something you want to update },{ upsert:true, //if object didn't found, insert new object to db new:true //return updated data },(err,doc)=>{ if(err){console.log(err)} return callback(null, doc); }) })) };