Электронный адрес пользователя 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?