我正在关注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。其他人有这个问题吗?
答案 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会尊重该地址。
要获取用户的电子邮件地址,无论他们是否公开,请拨打。您将以与/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
}
));