2016-02-12 9 views
11

Podążam za numerem Github’s OAuth flow i uzyskuję token dostępu, który daje mi dostęp do zakresu e-mail użytkownika. Kiedy wymieniać kod tokenu dostępu, używając końcowego https://github.com/login/oauth/access_token, mam następującą odpowiedź:E-mail użytkownika Github ma wartość zerową, mimo że użytkownik: zakres adresu e-mail

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

wygląda świetnie. Więc robię to żądanie, za pomocą tokena, aby moje dane użytkownika:

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

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

ja rozumiem mojego obiektu użytkownika jako odpowiedź, lecz własność email jest null. Ktoś jeszcze ma ten problem?

Odpowiedz

22

Dowiedziałem się, dlaczego tak się dzieje i jak go rozwiązać. Według docs:

Uwaga: Zwracany email jest publicznie widoczny adres e-mail użytkownika (lub null jeśli użytkownik nie podał adresu e-mail publicznego w ich profilu).

W ustawieniach profilu GitHub, pod email Publicznej, niektórzy użytkownicy (w tym ja) nie ta opcja ustawiona na „Nie pokazuj mojego adresu e-mail.” Wywołanie numeru /user zwraca tylko publiczny adres e-mail, więc jeśli użytkownik nie chce tego pokazać, interfejs API będzie go respektować.

enter image description here

Aby uzyskać adresy e-mail użytkownika, niezależnie od tego, czy są one publiczne, należy skorzystać z połączenia do /user/emails. Można by użyć tokenu dostępu w dokładnie taki sam sposób, jak wniosek /user:

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

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

Ta rozmowa dała mi następującą odpowiedź JSON:

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

przy użyciu node.js z paszportu github roztwór ma przejść 'zakres: [„użytkownika: e”]' konstruktora GitHubStrategy. Zauważ, że dostaniesz tablicę e-maili użytkownika, filtr dla "primary: true", jeśli chcesz, itp. –

+0

@AntonDrukh możesz rozwinąć? Czym byłaby inkantacja "paszport-github"? – Fergie

+0

@Fergie zobacz poniżej moją odpowiedź, zbyt długo na komentarz. –

4

@Fergie nie zmieścił to pod komentarzem, tak odpowiedzi na node.js passport-github postępowania:

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