Pertanyaan Github email pengguna nol, meskipun pengguna: lingkup email


aku mengikuti Aliran OAuth Github, dan memperoleh token akses yang memberi saya akses ke cakupan email pengguna. Saat saya menukar kode untuk token akses, menggunakan https://github.com/login/oauth/access_token titik akhir, saya mendapat tanggapan berikut:

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

Tampak hebat. Jadi saya membuat permintaan ini, menggunakan token untuk mendapatkan data pengguna saya:

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

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

Saya mendapatkan objek pengguna sebagai respons, tetapi properti email tidak valid. Ada yang punya masalah ini?


19
2018-02-12 23:32


asal


Jawaban:


Saya menemukan mengapa ini terjadi dan bagaimana mengatasinya. Menurut dokumen:

Catatan: Email yang dikembalikan adalah alamat email pengguna yang terlihat secara publik   (atau null jika pengguna belum menentukan alamat email publik di mereka   Profil).

Di pengaturan profil GitHub Anda, di bawah Email publik, beberapa pengguna (termasuk saya) memiliki opsi yang ditetapkan ke "Jangan tampilkan alamat email saya." Panggilan ke /user hanya mengembalikan alamat email publik, jadi jika pengguna tidak ingin ditampilkan, API akan menghargai itu.

enter image description here

Untuk mendapatkan alamat email pengguna terlepas dari apakah mereka publik atau tidak, gunakan panggilan untuk /user/emails. Anda akan menggunakan token akses dengan cara yang persis sama dengan /user permintaan:

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

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

Panggilan ini memberi saya tanggapan JSON berikut:

[
  {
    "email": "user@example.com",
    "primary": true,
    "verified": true
  }
]

30
2018-02-14 00:48



Tidak dapat memasukkan ini ke dalam komentar, jadi jawablah untuk node.js passport-github kasus:

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
}
));

6
2018-05-25 06:46