2016-02-12 22 views
11

Tôi đang theo dõi Github’s OAuth flow và nhận mã thông báo truy cập cho phép tôi truy cập phạm vi email của người dùng. Khi tôi đổi mã cho mã thông báo truy cập, sử dụng điểm cuối https://github.com/login/oauth/access_token, tôi nhận được phản hồi sau:Email người dùng Github là null, mặc dù người dùng: phạm vi email

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

Có vẻ tuyệt vời. Vì vậy, tôi thực hiện yêu cầu này, sử dụng mã thông báo để lấy dữ liệu người dùng của tôi:

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

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

Tôi nhận đối tượng người dùng của mình dưới dạng phản hồi, nhưng thuộc tính email là rỗng. Bất cứ ai khác có vấn đề này?

Trả lời

22

Tôi đã tìm hiểu lý do tại sao điều này xảy ra và cách giải quyết. Theo docs:

Lưu ý: Các email trả lại là địa chỉ của người dùng hiển thị công khai email (hoặc null nếu người dùng đã không được xác định một địa chỉ email nào trong hồ sơ cá nhân của họ).

Trong cài đặt cấu hình GitHub, dưới email Công, một số người dùng (bao gồm cả bản thân mình) đã lựa chọn đó thiết lập để "Không hiển thị địa chỉ email của tôi." Cuộc gọi đến /user chỉ trả lại địa chỉ email công khai, vì vậy nếu người dùng không muốn địa chỉ đó được hiển thị, API sẽ tôn trọng điều đó.

enter image description here

Để có được địa chỉ email của người dùng bất kể có hay không họ là công khai, sử dụng các cuộc gọi đến /user/emails. Bạn sẽ sử dụng thẻ truy cập trong cách chính xác giống như yêu cầu /user:

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

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

Cuộc gọi này đã cho tôi câu trả lời JSON sau:

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

sử dụng Node.js với hộ chiếu-github, giải pháp là để vượt qua 'phạm vi: [ 'user: email'] 'để các nhà xây dựng GitHubStrategy. Lưu ý rằng bạn sẽ nhận được một mảng email của người dùng, lọc cho 'primary: true' nếu bạn muốn, v.v. –

+0

@AntonDrukh bạn có thể xây dựng không? câu thần chú 'hộ chiếu-github' sẽ là gì? – Fergie

+0

@Fergie xem câu trả lời của tôi bên dưới, quá dài để nhận xét. –

4

@Fergie không thể phù hợp này vào một bình luận, để trả lời cho Node.js passport-github trường hợp:

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 
} 
)); 
Các vấn đề liên quan