我正在尝试使用此login example设置Facebook身份验证。示例有效,但当我退出并尝试再次登录时,护照会自动让我进入,而不会给我一个更改Facebook用户的选项。有关如何改变这种行为的任何想法?
答案 0 :(得分:5)
默认情况下,如果您已经授权使用Facebook登录,则后续的身份验证请求将是自动的,并且不会提示用户再次进行授权。有三种方法可以改变这种行为:
这是不可取的,因为您只想将用户从应用程序中注销而不是完全记录Facebook。
这是你最好的选择。为此,请使用有效的Facebook访问令牌对HTTP DELETE
进行https://graph.facebook.com/me/permissions
调用。阅读更多https://developers.facebook.com/docs/reference/api/user/#permissions。
Facebook支持auth_type
参数,每次设置为reauthenticate
时都会提示用户登录。阅读更多https://developers.facebook.com/docs/howtos/login/client-side-re-auth/。
Passport.js不支持将此参数开箱即用,因此您可能需要进行一些黑客操作才能使其在您的应用程序中运行,或者向passport-facebook GitHub项目提交拉取请求。
但是,您可以选择通过使用特定参数来提示用户每次重新进行身份验证。下面这样做的工作但是黑客和不推荐的方式:
FacebookStrategy.prototype.authorizationParams = function (options) {
var params = {},
display = options.display,
auth_type = options.auth_type;
if (display) params['display'] = display;
if (auth_type) params['auth_type'] = auth_type;
return params;
};
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "http://localhost:3000/auth/facebook/callback",
auth_type: "reauthenticate"
},
function(accessToken, refreshToken, profile, done) {
process.nextTick(function () {
return done(null, profile);
});
}
));
答案 1 :(得分:3)
Facebook Passport支持auth_type,即使用户已在浏览器上登录,也会重定向用户再次登录该应用的OAuth令牌。 要在Facebook上启用此重新登录行为,请使用以下代码
passport.authenticate('facebook', {authType: 'reauthenticate', callbackURL:...
答案 2 :(得分:0)
您也需要从Facebook注销(或从您的设置中的列表中删除该应用程序)。否则facebook会记住用户(您)已经接受登录您的应用程序并返回应用程序而不会向您询问任何内容。
答案 3 :(得分:0)
当查看选项时,值是{},那么我在authorizationParams中添加了 auth_type =“ reauthenticate” 字段,而不是将其作为选项放在构造函数中或作为Authenticate选项( 都不适合我)。
var fbStrategy = require('passport-facebook').Strategy;
fbStrategy.prototype.authorizationParams = function (options) {
var params = {};
params.auth_type = "reauthenticate";
// params.auth_nonce = hash.digest((new Date()).getTime());
// console.log(options,":options",params)
return params;
};
passport.use('facebook',new fbStrategy({
clientID: process.env.clientID,
clientSecret: process.env.clientSecret,
callbackURL: yourcallbackURL,
// this option to pass req
passReqToCallback : true
},
function (req, accessToken, refreshToken, profile, cb) {
......
}));