2016-02-12 4 views
11

Ich folge Github’s OAuth flow und erhalte ein Zugriffstoken, das mir Zugriff auf den E-Mail-Bereich des Benutzers gewährt. Wenn ich einen Code für einen Zugriffstoken auszutauschen, den https://github.com/login/oauth/access_token Endpunkt verwenden, erhalte ich die folgende Antwort:Github-Benutzer-E-Mail-Adresse ist null, trotz Benutzer: E-Mail-Bereich

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

sieht gut aus. Also habe ich diesen Antrag stellen, das Token mit meinen Benutzerdaten zu erhalten:

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

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

ich tun, um meine Benutzerobjekt als Antwort, aber die E-Mail-Eigenschaft ist null. Hat noch jemand dieses Problem?

Antwort

22

Ich fand heraus, warum dies auftritt und wie man es löst. Nach den docs:

Hinweis: Die zurückgegebene E-Mail ist der Nutzer öffentlich sichtbar E-Mail-Adresse (oder null, wenn der Benutzer angegeben hat keine Adresse in ihrem Profil öffentliche E-Mail) ist.

In Ihren GitHub Profileinstellungen unter öffentlichen E-Mail haben einige Benutzer (ich eingeschlossen), die Option auf „meine E-Mail-Adresse nicht zeigen.“ Der Anruf an /user gibt nur die öffentliche E-Mail-Adresse zurück. Wenn der Benutzer dies nicht sehen möchte, wird dies von der API respektiert.

enter image description here

Um die E-Mail-Adressen, unabhängig von Benutzern zu erhalten, ob sie öffentlich sind, um den Anruf zu /user/emails verwenden. Sie würden das Zugriffstoken verwenden in genau der gleichen Weise wie die /user Anfrage:

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

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

Dieser Aufruf hat mir die folgende JSON-Antwort:

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

mit node.js mit Pass-github ist die Lösung 'Umfang weitergeben müssen: [ 'user: E-Mail']' zum GitHubStrategy Konstruktor. Beachten Sie, dass Sie ein Array mit den E-Mails des Benutzers erhalten, filtern Sie nach 'primär: true', wenn Sie möchten, usw. –

+0

@AntonDrukh könnten Sie das ausarbeiten? Was wäre die "Pass-Github" Beschwörungsformel? – Fergie

+0

@Fergie meine Antwort unten sehen, zu lang für einen Kommentar. –

4

@Fergie dies nicht in einen Kommentar passen könnte, so für den node.js passport-github Fall zu beantworten:

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