github api - users - El correo electrónico del usuario de Github es nulo, a pesar del usuario: ámbito de correo electrónico
github api token (2)
Descubrí por qué ocurre esto y cómo resolverlo. Según los docs :
Nota: El correo electrónico devuelto es la dirección de correo electrónico visible públicamente del usuario (o
null
si el usuario no ha especificado una dirección de correo electrónico pública en su perfil).
En la configuración de su perfil de GitHub, en Correo electrónico público , algunos usuarios (incluido yo mismo) tienen esa opción configurada en "No mostrar mi dirección de correo electrónico". La llamada a /user
solo devuelve la dirección de correo electrónico pública, por lo que si el usuario no quiere que se muestre, la API lo respetará.
Para obtener las direcciones de correo electrónico del usuario, independientemente de si son públicas o no, utilice la llamada a /user/emails
. Usaría el token de acceso exactamente de la misma manera que la solicitud /user
:
Accept-Language: en-us
Accept: application/json
Authorization: token 83f42..xxx
Accept-Encoding: gzip, deflate
GET https://api.github.com/user/emails
Esta llamada me dio la siguiente respuesta JSON:
[
{
"email": "[email protected]",
"primary": true,
"verified": true
}
]
Estoy siguiendo el flujo de OAuth de Github y obteniendo un token de acceso que me da acceso al alcance del correo electrónico del usuario. Cuando cambio un código por un token de acceso, utilizando el punto final https://github.com/login/oauth/access_token , obtengo la siguiente respuesta:
{
access_token: ''83f42..xxx’,
token_type: ''bearer'',
scope: ''user:email''
}
Se ve muy bien. Entonces hago esta solicitud, usando el token para obtener mis datos de usuario:
Accept-Language: en-us
Accept: application/json
Authorization: token 83f42..xxx
Accept-Encoding: gzip, deflate
GET https://api.github.com/user
Obtengo mi objeto de usuario como respuesta, pero la propiedad de correo electrónico es nula. ¿Alguién mas está teniendo este problema?
No se pudo encajar esto en un comentario, así que respondiendo por el caso node.js passport-github
:
var GitHubStrategy = require(''passport-github'').Strategy;
passport.use(''github-login'', new GitHubStrategy({
clientID: config.clientId,
clientSecret: config.secret,
callbackURL: config.host + config.callback,
passReqToCallback: true, // req object on auth is passed as first arg
scope: [ ''user:email'' ], // fetches non-public emails as well
},
function (req, accessToken, refreshToken, profile, done) {
// find user by profile and update it
// or create the user object given the req, tokens and profile objs
// don''t forget to call `done(null, user)` once done
}
));