これらの問題とその解決方法について説明します。
PassportJSとその3次元戦略のドキュメントは開始するのに十分なようですが、開発中に次のような問題がありました。
1. facebookで、たとえばメールなどの必要なフィールドが提供されませんでした
2. vkontakte、電子メールも提供しませんでしたが、Facebookとは異なる理由で
そして、最初の問題を解決します。
ドキュメントには、許可自体を実行するときにスコープをオプションに渡す必要があると記載されています。
app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login', scope: [ 'email', 'publish_actions', 'user_friends', 'user_about_me', 'user_birthday' ] }), function(req, res) { // Successful authentication, redirect home. res.redirect('/'); });
しかし、とにかくメールは返ってきませんでした。 その結果、ソースコードを差し引いて、範囲を戦略自体の設定で転送し、カンマで区切る必要があることが明らかになりました。
passport.use(new FacebookStrategy({ clientID: FACEBOOK_APP_ID, clientSecret: FACEBOOK_APP_SECRET, callbackURL: "http://localhost:3000/auth/facebook/callback", scope: 'email', enableProof: false }, function(accessToken, refreshToken, profile, done) { User.findOrCreate({ facebookId: profile.id }, function (err, user) { return done(err, user); }); } ));
実際に動作しました。
2.ただし、VKontakteは特別であり、ユーザープロファイルで電子メールを送信しないため、access_tokenが要求された直後に、 passport-vkontakteの使用に関する問題は解決されていません。 彼はソースをより深く選択し始めました。 その結果、 passport-oauth2にそのようなコードが見つかりました。
if (arity == 5) { self._verify(accessToken, refreshToken, params, profile, verified); } else { // arity == 4 self._verify(accessToken, refreshToken, profile, verified); }
実際、これは、5つのパラメーターでコールバック検証を渡すことができ、accessTokenを受け取ったときに生のVKontakte応答がparamsに含まれることを示唆しています。
passport.use(new VKontakteStrategy({ clientID: VKONTAKTE_APP_ID, // VK.com docs call it 'API ID' clientSecret: VKONTAKTE_APP_SECRET, callbackURL: "http://localhost:3000/auth/vkontakte/callback" }, function(accessToken, refreshToken, params, profile, done) { //params.email - ! } ));
今のところすべてです。