2016年1月18日 星期一

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.

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

解法

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

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

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

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

參考資料,

沒有留言:

張貼留言

Facebook