2016-02-12 17 views
11

Sto seguendo Github’s OAuth flow e ottengo un token di accesso che mi consente di accedere all'ambito di posta elettronica dell'utente. Quando ho scambiare un codice per un token di accesso, utilizzando il https://github.com/login/oauth/access_token endpoint, ottengo la seguente risposta:L'e-mail utente Github è nullo, nonostante l'utente: ambito di e-mail

{ 
    access_token: '83f42..xxx’, 
    token_type: 'bearer', 
    scope: 'user:email' 
} 

sembra grande. Così faccio questa richiesta, utilizzando il token per ottenere il mio dati utente:

Accept-Language: en-us 
Accept: application/json 
Authorization: token 83f42..xxx 
Accept-Encoding: gzip, deflate 

GET https://api.github.com/user 

faccio ottenere il mio oggetto utente come una risposta, ma la proprietà e-mail è nullo. Qualcun altro ha questo problema?

risposta

22

Ho scoperto perché questo si verifica e come risolverlo. Secondo il docs:

Nota: L'e-mail restituito è l'indirizzo dell'utente pubblicamente visibile e-mail (o null se l'utente non ha specificato un indirizzo e-mail pubblica nel loro profilo ).

nelle impostazioni del profilo GitHub, sotto email Public, alcuni utenti (me compreso) hanno questa opzione impostata su "Non mostrare il mio indirizzo e-mail." La chiamata a /user restituisce solo l'indirizzo di posta elettronica pubblico, quindi se l'utente non desidera che venga visualizzato, l'API lo rispetterà.

enter image description here

per ottenere gli indirizzi di posta elettronica degli utenti, indipendentemente dal fatto che essi sono pubblici, utilizzare la chiamata a /user/emails. Si potrebbe utilizzare il token di accesso esattamente nello stesso modo in cui la richiesta /user:

Accept-Language: en-us 
Accept: application/json 
Authorization: token 83f42..xxx 
Accept-Encoding: gzip, deflate 

GET https://api.github.com/user/emails 

Questa chiamata mi ha dato la seguente risposta JSON:

[ 
    { 
    "email": "[email protected]", 
    "primary": true, 
    "verified": true 
    } 
] 
+2

uso node.js con passaporto GitHub, la soluzione è quella di passare 'ambito: [ 'user: email']' al costruttore GitHubStrategy. Nota che riceverai un array di e-mail dell'utente, filtri per 'primary: true' se vuoi, ecc. –

+0

@AntonDrukh potresti elaborare? quale sarebbe l'incantesimo "passaporto-gitubo"? – Fergie

+0

@Fergie vedi la mia risposta qui sotto, troppo a lungo per un commento. –

4

@Fergie non poteva andare bene questo in un commento, in modo da rispondere per il node.js passport-github caso:

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 
} 
));