![](/img/trans.png)
[英]Passport-Facebook authentication window not popping up, user still added
[英]Passport-Facebook authentication is not providing email for all Facebook accounts
我正在使用Passport-Facebook身份驗證。
passport.use(new FacebookStrategy({ clientID: 'CLIENT_ID', clientSecret: 'CLIENT_SECRET', callbackURL: "http://www.example.com/auth/facebook/callback" }, function (accessToken, refreshToken, profile, done) { process.nextTick(function () { console.log(profile) }); } ));
對於某些 Facebook 帳戶,我沒有獲得 email_id,我什至嘗試使用如下的范圍變量,但仍然無法獲得 email_id。
profileUrl : " " 和 ProfileFields : ['','']
確保這兩件事在你的代碼中:
passport.use(new FacebookStrategy({
clientID: 'CLIENT_ID',
clientSecret: 'CLIENT_SECRET',
callbackURL: "http://www.example.com/auth/facebook/callback"
passReqToCallback : true,
profileFields: ['id', 'emails', 'name'] //This
},
和這個:
app.get('/connect/facebook', passport.authorize('facebook', { scope : ['email'] }));
這使您可以訪問以下內容:
最后一個是一個數組,所以使用profile.emails[0].value
來獲取用戶的第一個電子郵件地址。
正如shamim reza
指出的那樣,您可能需要檢查profile.emails !== undefined
因為該屬性僅在用戶至少有一個經過驗證的電子郵件地址時才存在。
正如Weft
指出的,您可能必須使用屬性email
而不是emails
。
當您進行身份驗證時,請使用與此類似的內容。 進行身份驗證時,您需要在范圍內使用 add 'email'。
app.get('/auth/facebook',
passport.authenticate('facebook', { scope: ['email']}),
function(req, res){
});
這對我有用。
以下是一些幫助我解決問題的鏈接。
https://github.com/jaredhanson/passport-facebook/issues/11 https://github.com/jaredhanson/passport-facebook#how-do-i-ask-a-user-for-additional-permissions
我想在這里添加更多信息。
在創建 FacebookStrategy 時添加profileFields: ['emails']
和passport.authorize('facebook', { scope : ['email'] })
解決了大多數用戶的問題。
還有其他可能的原因導致您在身份驗證后無法收到用戶的電子郵件。
您需要確保您的用戶沒有上面列出的任何問題。 可以找到更多信息https://developers.facebook.com/bugs/1802930019968631/
當護照沒有返回profile.emails, profile.name.givenName, profile.name.familyName
字段,或者如果它們丟失,您可以嘗試解析https://graph.facebook.com/v3.2/
url,雖然你仍然需要一個令牌。 您訪問 url,當然有一個有效的令牌,例如:
https://graph.facebook.com/v3.2/me?fields=id,name,email,first_name,last_name&access_token=
它輸出一個 JSON 響應,如:
{
"id": "5623154876271033",
"name": "Kurt Van den Branden",
"email": "kurt.vdb\u0040example.com",
"first_name": "Kurt",
"last_name": "Van den Branden"
}
安裝請求模塊( $ npm install request --save
),以便能夠解析 JSON url 並在您的 Passport.js 文件中:
const request = require("request");
passport.use(new FacebookStrategy({
clientID : 'CLIENT_ID',
clientSecret : 'CLIENT_SECRET',
callbackURL : "https://example.com/auth/facebook/callback"
},
function(req, token, profile, done) {
let url = "https://graph.facebook.com/v3.2/me?" +
"fields=id,name,email,first_name,last_name&access_token=" + token;
request({
url: url,
json: true
}, function (err, response, body) {
let email = body.email; // body.email contains your email
console.log(body);
});
}
));
您可以向 url 添加許多其他參數,盡管其中一些需要用戶許可才能返回值。 你可以玩它: https : //developers.facebook.com/tools/explorer/
確保您在第一個 .authenticate() 調用中提供 scope 參數,而不是回調。
像這樣:
router.get("/auth/facebook", passport.authenticate("facebook", {
scope: [ "email" ], // scope goes here, not below
}));
router.get("/auth/facebook/callback",
passport.authenticate("facebook", {
successRedirect: "/",
failureRedirect: "/login",
}),
);
您可以使用在passport-facebook
站點中作為示例提供的代碼作為起點。 然后,要訪問電子郵件,請務必查看@Forivin 的回答。
passport.use(new FacebookStrategy({
clientID: 'CLIENT_ID',
clientSecret: 'CLIENT_SECRET',
callbackURL: "http://www.example.com/auth/facebook/callback"
},
function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
console.log(profile)
});
}
));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.