Электронный адрес пользователя Github равен нулю, несмотря на то, что пользователь: область электронной почты
Я следую Githubs 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. У кого-нибудь еще есть эта проблема?
Ответы
Ответ 1
Я узнал, почему это происходит и как его решить. Согласно docs:
Примечание. Возвращенное электронное письмо является общедоступным почтовым адресом пользователя (или null
, если пользователь не указал общедоступный адрес электронной почты в своем профиль).
В настройках профиля GitHub в разделе Открытая электронная почта, некоторые пользователи (включая меня) имеют эту опцию: "Не показывать мой адрес электронной почты". Вызов /user
возвращает только общедоступный адрес электронной почты, поэтому, если пользователь не хочет его показывать, API будет уважать это.
![введите описание изображения здесь]()
Чтобы получить адреса электронной почты пользователя независимо от того, являются ли они общедоступными, используйте вызов /user/emails
. Вы должны использовать токен доступа точно так же, как запрос /user
:
Accept-Language: en-us
Accept: application/json
Authorization: token 83f42..xxx
Accept-Encoding: gzip, deflate
GET https://api.github.com/user/emails
Этот вызов дал мне следующий ответ JSON:
[
{
"email": "[email protected]",
"primary": true,
"verified": true
}
]
Ответ 2
Не удалось вписать это в комментарий, поэтому passport-github
случай 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
}
));
Ответ 3
Я создаю OAuth для своего приложения. Согласно политике GitHub у пользователей должен быть адрес электронной почты, а также мне нужно знать адрес электронной почты пользователя, чтобы сравнить его с базой данных управления пользователями моего приложения, если это письмо уже зарегистрировано ранее или нет?
В ответе Github, как упоминалось ранее в этом разделе, адрес электронной почты пользователя по умолчанию не отображается, но в этом запросе указан адрес электронной почты:
curl -u "USERNAMEorEMAILADDRESS" https://api.github.com/user/emails
И ответ:
{
"email": "[email protected]",
"primary": true,
"verified": true,
"visibility": "private"
},
{
"email": "[email protected]",
"primary": false,
"verified": true,
"visibility": null
}
]
(Но для этого запроса требуется пароль)
мой вопрос заключается в том, как я могу получить доступ/узнать адрес электронной почты пользователя из OAuth, не запрашивая повторно пароль или API TOKEN
?