javascript - password - passport js tutorial
La autenticación de Passport-Facebook no proporciona correo electrónico para todas las cuentas de Facebook (5)
Asegúrate de que estas dos cosas estén en tu código:
passport.use(new FacebookStrategy({
clientID: ''CLIENT_ID'',
clientSecret: ''CLIENT_SECRET'',
callbackURL: "http://www.example.com/auth/facebook/callback"
passReqToCallback : true,
profileFields: [''id'', ''emails'', ''name''] //This
},
y esto:
app.get(''/connect/facebook'', passport.authorize(''facebook'', { scope : [''email''] }));
Esto le da acceso a lo siguiente:
- Perfil Id
- profile.name.givenName
- profile.name.familyName
- perfil.emails
El último es una matriz, así que use profile.emails[0].value
para obtener la primera dirección de correo electrónico del usuario.
Como señaló shamim reza
, es posible que desee comprobar si profile.emails !== undefined
porque la propiedad solo existe si el usuario tiene al menos una dirección de correo electrónico verificada.
Estoy usando la autenticación Passport-Facebook .
passport.use(new FacebookStrategy({ clientID: ''CLIENT_ID'', clientSecret: ''CLIENT_SECRET'', callbackURL: "http://www.example.com/auth/facebook/callback" }, function (accessToken, refreshToken, profile, done) { process.nextTick(function () { console.log(profile) }); } ));
Para algunas de las cuentas de Facebook no obtengo el email_id e incluso lo intenté usando una variable de ámbito como la siguiente, pero aún así no puedo obtener el email_id.
profileUrl: "" y ProfileFields: ['''', '''']
Cuando esté autenticando, use algo similar a esto. Debe usar agregar ''correo electrónico'' en el alcance cuando se autentique.
app.get(''/auth/facebook'',
passport.authenticate(''facebook'', { scope: [''email'']}),
function(req, res){
});
Eso ha funcionado para mi.
Aquí hay algunos enlaces que me ayudaron.
https://github.com/jaredhanson/passport-facebook/issues/11 https://github.com/jaredhanson/passport-facebook#how-do-i-ask-a-user-for-additional-permissions
Me gustaría agregar más información aquí.
Al agregar profileFields: [''emails'']
al crear FacebookStrategy y passport.authorize(''facebook'', { scope : [''email''] })
resuelve el problema para la mayoría de los usuarios.
Hay otras razones posibles por las que no recibirá el correo electrónico del usuario después de la autenticación.
- Sin dirección de correo electrónico en la cuenta
- No hay una dirección de correo electrónico confirmada en la cuenta
- No hay una dirección de correo electrónico verificada en la cuenta
- El usuario ingresó un punto de control de seguridad que requirió que reconfirmaran su dirección de correo electrónico y aún no lo han hecho.
- La dirección de correo electrónico del usuario es inalcanzable
Debe asegurarse de que su usuario no tenga ninguno de los problemas enumerados anteriormente. se puede encontrar más información https://developers.facebook.com/bugs/1802930019968631/
Puede usar el código proporcionado como ejemplo en el sitio de passport-facebook
como punto de partida. Luego, para acceder al correo electrónico, asegúrese de verificar la respuesta de @ Forivin .
passport.use(new FacebookStrategy({
clientID: ''CLIENT_ID'',
clientSecret: ''CLIENT_SECRET'',
callbackURL: "http://www.example.com/auth/facebook/callback"
},
function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
console.log(profile)
});
}
));