2016-02-12 6 views
11

にもかかわらず、私は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 

私は応答として、私のユーザーオブジェクトを取得んが、電子メールのプロパティがnullです。この問題を抱えている人は誰ですか?

答えて

22

これがなぜ発生し、どのように解決するのかを知りました。 docsによると:

注:(ユーザーが自分の プロファイルにパブリックメールアドレスを指定していない場合やnull)返されたメールは、ユーザーの公開さメールアドレス です。 公開メールの下で、(私を含め)一部のユーザーは、そのオプションをするように設定されているあなたのGitHubのプロファイル設定で

、「私のメールアドレスを表示しません。」 /userへの呼び出しでは、公開されているメールアドレスのみが返されるため、ユーザーが表示したくない場合はAPIがそれを尊重します。

enter image description here

/user/emailsへの呼び出しを使用して、関係なく、彼らは公開されているか否かのユーザの電子メールアドレスを取得します。この呼び出しは私に次のようなJSON応答を与えた

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

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

[ 
    { 
    "email": "[email protected]", 
    "primary": true, 
    "verified": true 
    } 
] 
+2

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 } )); 
、溶液は'範囲を通過させることです。ユーザーの電子メールの配列を取得し、必要に応じて 'primary:true'をフィルタリングすることに注意してください。 –

+0

@AntonDrukhあなたは精巧にできますか? 「パスポートギブス」はどんなものなのでしょうか? – Fergie

+0

@Fergieコメントはあまりにも長い私の答えを参照してください。 –

4

@Fergieは、コ​​メントにこれを合うことができませんでしたあなたは/user要求とまったく同じ方法でアクセストークンを使用しますそうNode.jsのpassport-github場合の応答:[「ユーザー:メール」] `GitHubStrategyコンストラクタにパスポートのGitHubとのNode.jsを使用

関連する問題