尽管用户:电子邮件范围,Github用户电子邮件仍为null

时间:2016-02-12 23:32:09

标签: github-api

我正在关注Github’s OAuth flow,并获取一个访问令牌,让我可以访问用户的电子邮件范围。当我使用https://github.com/login/oauth/access_token端点交换访问令牌的代码时,我得到以下响应:

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

看起来很棒。所以我发出这个请求,使用令牌获取我的用户数据:

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

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

我确实将我的用户对象作为响应,但email属性为null。其他人有这个问题吗?

2 个答案:

答案 0 :(得分:38)

我发现了为什么会发生这种情况以及如何解决它。根据{{​​3}}:

  

注意:返回的电子邮件是用户公开显示的电子邮件地址   (或@if(Model.PictureCount > 0) { if(Model.Id == 18777) { @Html.Raw("<a target='_blank' href='XXXX'>") } <img src="@Model.PicturesPath@Model.Pictures[0].Filename" width="535" height="385" /> if(Model.Id == 18777) // <-- this If is not working has a C# condition { @Html.Raw("</a>"); } } 如果用户未在其中指定公共电子邮件地址   配置文件)。

在您的GitHub个人资料设置中,在公共电子邮件下,某些用户(包括我自己)将该选项设置为“不显示我的电子邮件地址”。对null的调用仅返回公共电子邮件地址,因此如果用户不希望显示该公共电子邮件地址,则API会尊重该地址。

docs

要获取用户的电子邮件地址,无论他们是否公开,请拨打enter image description here。您将以与/user请求完全相同的方式使用访问令牌:

/user

此调用给了我以下JSON响应:

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

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

答案 1 :(得分:6)

无法将其纳入评论中,因此请回答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
}
));