facebook request not return email when using passport-facebook

facebook request not return email when using passport-facebook

[
自從 facebook api 改為 2.4 版本之後,項目就變的越來越多,變化越來越大。
對於 node.js 開發者來說,大部分開發者使用 login 或者帳號驗證機制大多會採用 passport.js 進行驗證。

因應到 facebook 2.4 以後的版本,特別要設定欄位的回傳,才會收到 email 的設定。
在一般使用下,如果沒有要取道額外授權,大部分都是直接使用 passport + facebook-passport 直接按照 demo 就可以設定完成。

但是如果像是要多要求一個 email 的話,而且不幸你得 facebook app 又是最近才開始建立的,勢必就只能使用 2.4 || 2.5 的版本。

就會發生取不到 email 的狀況,解法其實 facebook-passport 有提到怎麼進行。說明連結

The Facebook profile is very rich, and may contain a lot of information. The strategy can be configured with a profileFields parameter which specifies a list of fields (named by Portable Contacts convention) your application needs. For example, to fetch only user's facebook ID, name, and picture, configure strategy like this.<br></br>

意思指,如果你需要特殊權限,或者指定某些特別欄位的話,請必須要加入 profileFields ,設定需要的欄位(當沒有特別設定就會略過)

解法

在使用 passport 的時候,設定方法就需要設定類似如下

passport.use(new FacebookStrategy({<br></br> clientID: config.facebook.clientID,<br></br> clientSecret: config.facebook.clientSecret,<br></br> callbackURL: config.facebook.callbackURL,<br></br> profileFields: ['id', 'email', 'gender', 'link', 'locale', 'name', 'timezone', 'updated_time', 'verified'],<br></br> },

另外,如果大家像我一樣是採用 sails.js + passport.js ,可以透過 config 設定的方式,就可以正確取得 facebook return data.

passport:{<br></br> facebook:{<br></br> name: 'Facebook',<br></br> protocol: 'oauth2',<br></br> strategy: require('passport-facebook').Strategy,<br></br> options:{<br></br> clientID: config.facebook.clientID,<br></br> clientSecret: config.facebook.clientSecret,<br></br> scope: [ 'email', 'public_profile' ],<br></br> profileFields: ['id', 'displayName', 'email'],<br></br> callbackURL: config.facebook.callbackURL,<br></br> }<br></br> }<br></br> }

參考資料,

CaesarChi

Web developer, focus on website fullstack, special JavaScript, and love sharing developing experience and communicate with developers. http://about.me/clonn